为什么 grep 不能与重定向一起使用?

为什么 grep 不能与重定向一起使用?

使用top带有重定向的命令效果很好:

top > top.log

现在我想使用 grep 来过滤某一行:

top | grep "my_program" > top.log

但日志文件将保持为空。但是 grep 在使用时会提供输出

top | grep "my_program"

必须将其中my_program替换为正在运行的程序才能看到一些输出。

为什么我的方法不起作用?我该如何解决它?

答案1

我得到了与你描述的相同的行为。在 Ubuntu 11.10 上

top | grep "my_program" > top.log

不产生任何输出。

我相信其原因是 grep 正在缓冲其输出。要告诉 GNU grep 逐行输出输出,请使用以下--line-buffered选项:

top | grep --line-buffered "my_program" > top.log

另请参阅此那么问题其他潜在的解决方案。

答案2

你应该使用:

top -n 1 | grep "blah" > top.log

“-n 1”在一次迭代中运行顶部,然后退出,而不是每隔几秒不断更新

因为你只是在寻找一行,尽管 ps 是一个更好使用的工具。

答案3

我解决这个问题的方法是:

while :;do top -b -n 1 | grep "my_program" >> top.log;done &

通过这种方式,我可以在后台为 my_program 提供一个正在运行的监视器,并将所有结果保存在文件 top.log 中。

答案4

虽然两者都对我有用,但我认为 Lev Levitsky 的建议是正确的。使用-b论证。

输出重定向很可能是问题所在,并且您没有通过 stdout 获取任何内容,因此请尝试以下操作:

top -b 2>&1 | grep "my_program" > top.log

请注意,您也可能会遇到输出缓冲问题。您的 shell 不会不断写入该文件,因此可能需要一段时间才能top.log填充。

相关内容