为什么在使用grep两次时没有显示输出?

rad*_*man 41 linux command-line grep file pipe

基本上我想知道为什么这不输出任何东西:

tail --follow=name file.txt | grep something | grep something_else 
Run Code Online (Sandbox Code Playgroud)

你可以假设它应该产生输出我已经运行了另一行来确认

cat file.txt | grep something | grep something_else
Run Code Online (Sandbox Code Playgroud)

好像你不能多次输出尾巴的输出!?任何人都知道这笔交易是什么,有没有解决方案?

编辑:要回答到目前为止的问题,该文件肯定有grep应显示的内容.作为证据,如果grep是这样做的:

tail --follow=name file.txt | grep something
Run Code Online (Sandbox Code Playgroud)

输出显示正确,但如果使用它:

tail --follow=name file.txt | grep something | grep something
Run Code Online (Sandbox Code Playgroud)

没有显示输出.

如果有帮助我运行ubuntu 10.04

小智 87

在管道内部时,您可能还会遇到grep缓冲问题.即,你没有看到输出

   tail --follow=name file.txt | grep something > output.txt
Run Code Online (Sandbox Code Playgroud)

因为grep会缓冲自己的输出.

使用--line-buffered开关为grep解决这个问题:

tail --follow=name file.txt | grep --line-buffered something > output.txt
Run Code Online (Sandbox Code Playgroud)

如果您希望尽快将后续结果输入output.txt文件,这将非常有用.


rad*_*man 6

弄清楚这里发生了什么.事实证明,该命令正在工作,只是输出需要很长时间才能到达控制台(在我的情况下大约120秒).这是因为标准输出上的缓冲区不是写入每一行而是写入每个块.因此,不是在写入文件时从文件中获取每一行,而是每2分钟左右就会得到一个巨大的块.

应该注意这是正常的:

tail file.txt | grep something | grep something
Run Code Online (Sandbox Code Playgroud)

这是文件的以下内容--follow=name是有问题的.

我的目的,我发现了一个办法解决它,我正打算做的是拍摄第一grep来一个文件的输出,这样的命令是:

tail --follow=name file.txt | grep something > output.txt
Run Code Online (Sandbox Code Playgroud)

解决这个问题的方法是使用如下script命令:

script -c 'tail --follow=name file.txt | grep something' output.txt
Run Code Online (Sandbox Code Playgroud)

脚本捕获命令的输出并将其写入文件,从而避免第二个管道.

这有效地为我解决了这个问题,我已经解释了为什么命令没有像我预期的那样工作,问题解决了.

仅供参考,这些其他stackoverflow问题是相关的:
欺骗应用程序认为它的stdin是交互式的,而不是管道
强制另一个程序的标准输出使用Python无缓冲