为什么grep无法与重定向一起使用?


15

top命令与重定向一起使用可以正常工作:

top > top.log

现在,我想使用grep过滤特定行:

top | grep "my_program" > top.log

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

top | grep "my_program"

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

为什么我的方法行不通?我该如何解决呢?

bash  grep 

2
我只是尝试过,它对我有用。但是,您可能应该考虑使用-b选项topps代替。
列夫·列维茨基2012年

-b没有解决我的问题,但是解决了一些编码问题。谢谢。

Answers:


22

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

top | grep "my_program" > top.log

不产生任何输出。

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

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

另请参阅此SO问题以了解其他潜在解决方案。


3
+1 --line-buffered解决了这个问题。

谢谢,这也为我解决了问题。该-b选项仍然是Lev Levitsky的一个很好的建议。这就解决了日志文件的一些编码问题。

2

您应该使用:

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

“ -n 1”会先运行一次,然后退出,而不是每隔几秒钟不断更新

因为您只是在寻找一条线,但是ps将是更好的使用工具。


1

我针对此问题的解决方法是:

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

这样,我可以在后台为my_program设置一个正在运行的监视器,并将所有结果保存在文件top.log中。



0

尽管两者都对我有用,但我认为列夫·列维茨基的建议是正确的。使用-b参数。

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.