我正在尝试学习更多的 Linux,根据经验,最好的方法就是尝试用头撞墙。现在我已经手动完成了几次任务,我想将其自动化。这涉及制作一个 oneliner 来终止一些任务,以便我可以重新启动它们。
目前我正在处理以下工作:
for i in `ps aux | egrep "[c]ouchpotato|[s]abnzbd|[s]ickbeard|[d]eluge|[n]zbhydra"|awk '{print $2, $11, $12}'`; do echo $i; done
问题是,一旦我运行 for 循环,它就会破坏我从 awk 获得的行。
运行
ps aux | egrep "[c]ouchpotato|[s]abnzbd|[s]ickbeard|[d]eluge|[n]zbhydra"|awk '{print $2, $11, $12}'
给了我我正在寻找的结果,即:
27491 /usr/local/couchpotatoserver-custom/env/bin/python /usr/local/couchpotatoserver-custom/var/CouchPotatoServer/CouchPotato.py
27504 /usr/local/deluge/env/bin/python /usr/local/deluge/env/bin/deluged
27525 /usr/local/deluge/env/bin/python /usr/local/deluge/env/bin/deluge-web
27637 /usr/local/nzbhydra/env/bin/python /usr/local/nzbhydra/share/nzbhydra/nzbhydra.py
27671 /usr/local/sabnzbd/env/bin/python /usr/local/sabnzbd/share/SABnzbd /SABnzbd.py
28084 /usr/local/sickbeard-custom/env/bin/python /usr/local/sickbeard-custom/var/SickBeard/SickBeard.py
但将其添加到我的 for 循环中会将其分解为:
27491
/usr/local/couchpotatoserver-custom/env/bin/python
/usr/local/couchpotatoserver-custom/var/CouchPotatoServer/CouchPotato.py
27504
/usr/local/deluge/env/bin/python
/usr/local/deluge/env/bin/deluged
etc...
我的目标是让 $i 包含整行 - 这可能吗?另外,是否可以仅使用来自 $11 和 $12 的 get 命令?我不需要拥有 python 的完整路径,甚至不需要拥有应用程序的完整路径。
谢谢!
答案1
请注意,for
循环输出在单词边界(即空格/换行符)处被分解。而您所说的您想要的是包含在$i
.
所以你需要做以下两件事:
- 将输入字段分隔符设置为换行符。
禁用通配符扩展。
set -f;IFS=$'\n'; for i in `.....`;do echo "$i"; done
注意:不要引用反引号,否则你最终会给循环提供for
一大堆参数,这将是整个 ps 的输出,这对你没有任何好处。
华泰