为什么 grep 不适用于重定向?

15 grep bash

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

top > top.log
Run Code Online (Sandbox Code Playgroud)

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

top | grep "my_program" > top.log
Run Code Online (Sandbox Code Playgroud)

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

top | grep "my_program"
Run Code Online (Sandbox Code Playgroud)

哪里my_program必须被一个正在运行的程序替换才能看到一些输出。

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

小智 24

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

top | grep "my_program" > top.log
Run Code Online (Sandbox Code Playgroud)

不产生任何输出。

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

top | grep --line-buffered "my_program" > top.log
Run Code Online (Sandbox Code Playgroud)

有关其他潜在解决方案,另请参阅此SO 问题

  • +1 `--line-buffered` 解决了这个问题。 (3认同)