我想编写一个脚本来循环输出shell命令的输出(可能是数组?):ps命令
这里是在shell命令输出中:
ps -ewo pid,cmd,etime | grep python | grep -v grep | grep -v sh 3089 python /var/www/atm_securit 37:02 17116 python /var/www/atm_securit 00:01 17119 python /var/www/atm_securit 00:01 17122 python /var/www/atm_securit 00:01 17125 python /var/www/atm_securit 00:00
将其转换成bash脚本(片段):
for tbl in $(ps -ewo pid,etime | grep python | grep -v grep | grep -v sh) do echo $tbl done
但是输出成为:
创build复杂的linux命令的bash脚本
如何从一个string中为文件中的每一行select第n个字符?
使用bash对文件进行算术运算
Linux的GNU getopt:忽略未知的可选参数?
如何获得bashvariables在awkpipe道上工作
3089 python /var/www/atm_securit 38:06 17438 python /var/www/atm_securit 00:02 17448 python /var/www/atm_securit 00:01
我怎么循环像shell输出中的每一行,但在bash脚本?
linux的bash – 从另一个目录中删除一个目录中的所有文件
Bash if语句:我可以做一个任务和比较吗?
使用Bash脚本来查找文件的平均值
如何在Elastic Beanstalk启动时守护Rails Rake任务
除非要将内部字段分隔符 $IFS的值更改为n否则不要循环执行shell命令的结果。 这是因为行将会得到分词的主题,导致你看到的实际结果。 意思是如果你有一个像这样的文件:
foo bar hello world
以下为循环
for i in $(cat file); do echo "$i" done
给你:
foo bar hello world
即使你使用IFS='n'这些行仍然可能会导致文件名扩展
我建议使用while + read因为read逐行读取。
此外,如果您正在搜索属于某个二进制文件的pid,我会使用pgrep 。 但是,由于python可能会显示为不同的二进制文件,如python2.7或python3.4我建议将-f传递给pgrep ,这使得它可以搜索整个命令行,而不是只搜索名为python二进制文件。 但是,这也将找到像cat foo.py一样开始的cat foo.py 。 你被警告了! 最后,您可以按照您的意愿改进传递给pgrep的正则表达式。
例:
pgrep -f python | while read -r pid ; do echo "$pid" done
或者如果您还想要进程名称:
pgrep -af python | while read -r line ; do echo "$line" done
如果你想在不同的变量中使用进程名称和PID:
pgrep -af python | while read -r pid cmd ; do echo "pid: $pid,cmd: $cmd" done
你看, read提供了一个灵活和稳定的方式来处理命令行输出。
顺便说一句,如果你喜欢你的ps .. | grep 通过pgrep ps .. | grep命令行使用以下循环:
ps -ewo pid,etime,cmd | grep python | grep -v grep | grep -v sh | while read -r pid etime cmd ; do echo "$pid $cmd $etime" done
请注意我是如何改变etime和cmd的顺序的。 因此为了能够将可以包含空格的cmd读入到一个变量中。 这是有效的,因为read会将行分解为多个变量。 行的剩余部分 – 可能包括空格 – 将被分配给在命令行中指定的最后一个变量。
当在bash中使用for循环时,默认情况下会使用whitespaces给定的列表,这可以通过使用所谓的内部字段选择器或短IFS 。
IFS内部字段分隔符,用于扩展后的字词拆分,以及使用读取内置命令将字词拆分为单词。 默认值是“”。
对于您的示例,我们需要告诉IFS使用new-lines作为中断点。
IFS=$`n` for tbl in $(ps -ewo pid,etime | grep python | grep -v grep | grep -v sh) do echo $tbl done
本示例在我的机器上返回以下输出。
668 /usr/bin/python /usr/bin/ud 03:05:54 27892 python 00:01
我发现你可以用双引号做这个:
while read -r proc; do #do work done <<< "$(ps -ewo pid,etime | grep python | grep -v grep | grep -v sh)"
这将保存每行到数组而不是每个项目。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。