使用“for”和 grep/egrep 编写脚本

使用“for”和 grep/egrep 编写脚本

我正在尝试学习更多的 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.

所以你需要做以下两件事:

  1. 将输入字段分隔符设置为换行符。
  2. 禁用通配符扩展。

    set -f;IFS=$'\n'; for i in `.....`;do echo "$i"; done
    

注意:不要引用反引号,否则你最终会给循环提供for一大堆参数,这将是整个 ps 的输出,这对你没有任何好处。

华泰

相关内容