Bash输出与命令行不同

时间:2012-08-27 05:31:38

标签: bash

我已尝试使用grep尝试解决此问题的所有类型的过滤器,但只是无法破解它。

cpumem="$(ps aux | grep -v 'grep' | grep 'firefox-bin' | awk '{printf $3 "\t" $4}'

我正在提取进程的CPU和内存使用情况,当我从命令行运行它时,我得到正确输出的2个字段:

ps aux | grep -v 'grep' | grep 'firefox-bin' | awk '{printf $3 "\t" $4}'
> 1.1 4.4

但是从bash脚本中执行的相同命令产生了这个:

cpumem="$(ps aux | grep -v 'grep' | grep 'firefox-bin' | awk '{printf $3 "\t" $4}')"
echo -e cpumem
> 1.1 4.40.0 0.10.0 0.0

我猜它正在拾取3条记录,但我不知道从哪里来。

我使用grep -v'grep过滤掉任何其他grep进程,有人可以提供任何建议或更可靠的方法吗?

3 个答案:

答案 0 :(得分:0)

也许你有3条记录,因为3个firefox正在运行(或者一个正在运行,它正在自行进行线程化)。

您可以通过提供ps和选项来选择进程来避免grep hazzle。例如。 -C按名称选择进程。使用ps -C firefox-bin,您只能获得firefox进程。但是,当存在多个流程时,这根本没有帮助。

(您也可以使用ps选项仅输出您想要的列,因此您的行就像

ps -C less --no-headers -o %cpu,%mem

)。

对于三重记录,你必须提出一个解决方案,应该发生什么,不止一个正在运行。在具有线程编程的多用户环境中,总会出现一种情况,即您有多个进程。有很多可能的解决方案,没有人可以帮助你,正如你所说的那样,你将不会这样做。人们可以想到只从一个用户中选择的解决方案,只选择具有最低pid的解决方案,或者在组的情况下选择进程领导者,以更改封闭的bash脚本以使用循环来处理多个值或使其成为可能当ps返回多个结果时,以某种方式工作不同。

答案 1 :(得分:0)

我无法重现问题,但为了帮助您调试,请尝试在awk命令中打印$ 11,这将告诉您它正在讨论的过程

cpumem =“$(ps aux | grep -v'grep'| grep'firefox-bin'| awk'{printf $ 3”\ t“$ 4”\ t“$ 11”\ n“}')” echo -e cpumem

答案 2 :(得分:0)

这实际上是输出显示的简单修复;在echo语句中,将变量用双引号括起来:

echo -e "$cpumem"

如果不使用双引号,则不会通过将换行符转换为单个空格(或空值)来保留换行符。使用引号,输出时保留变量的原始文本。

如果您的输出包含多个进程(即 - 多行),则表示您的grep实际匹配多行。 firefox-bin可能有一个子进程正在运行,可能是一个插件/容器?使用ps aux11th列会告诉您实际流程是什么,因此您可以将awk更新为以下内容(用于调试):

awk '{printf $3 "\t" $4 "\t" $11}'