问题描述
当我这样做
ps -ax|grep myApp
我得到一行带有PID和我的应用程序的东西。
现在,我喜欢处理ps -ax的整个结果(没有grep,所以是完整输出):
要么将其存储在变量中,然后在其后进行grep
或在for循环中浏览结果,例如像这样:
for a in $(ps -ax)
do
echo $a
done
不幸的是,它会分隔每个空格,而不是像grep那样用换行符分隔。
任何想法,我如何才能完成一个或另一个(来自变量或for循环的grep)?
重要提示::请不要bash,只有POSIX,所以#!/ bin / sh
预先感谢
解决方法
就像上面所说的,而while循环在这里可能会有所帮助。
更有用的一件事是--no-headers
参数,它使ps跳过标题。
或者-甚至更好-指定您需要处理的确切列,例如ps -o pid,command --no-header ax
整个代码看起来像
processes=`ps --no-headers -o pid,command ax`
echo "$processes" | while read pid command; do
echo "we have process with pid $pid and command line $command"
done
此方法的唯一缺点是,while循环中的命令将在子shell中执行,因此,如果需要将一些var导出到父进程,则必须使用进程间通信的东西来完成它。
我通常将结果转储到while循环之前创建的临时文件中,并在循环结束后读取它们。
,我通过在执行命令时删除空格找到了解决方案:
result=$(ps -aux|sed 's/ /_/g')
您还可以通过删除重复的空格来使其更易于过滤:
result=$(ps -aux| tr -s ' '|sed 's/ /_/g')