存储“ ps -ax”的结果,以便以后对其进行迭代

问题描述

当我这样做

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')