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

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

tail --follow=name file.txt | grep something | grep something_else 

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

 cat file.txt | grep something | grep something_else 

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

编辑:为了回答迄今为止的问题,文件肯定有内容,应该由grep显示。 作为grep是否如此完成的证据:

 tail --follow=name file.txt | grep something 

输出显示正确,但是如果使用这个:

 tail --follow=name file.txt | grep something | grep something 

没有输出显示。

如果有帮助,我正在运行的Ubuntu 10.04

在pipe道内部时,您也可能遇到grep缓冲问题。 即,你看不到输出

  tail --follow=name file.txt | grep something > output.txt 

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

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

 tail --follow=name file.txt | grep --line-buffered something > output.txt 

如果您想尽可能快地将下面的结果input到output.txt文件中,这是非常有用的。

找出这里发生了什么事。 事实certificate,该命令正在工作,只是输出需要很长时间才能到达控制台(在我的情况下大约是120秒)。 这是因为标准输出上的缓冲区不是写在每行而是写在每个块上。 所以,不要在写文件的时候把每一行都从文件中读出来,而是每隔2分钟就会得到一个巨大的块。

应该指出,这工作正常:

 tail file.txt | grep something | grep something 

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

为了我的目的,我find了一个方法,我打算做的是将第一个grep的输出捕获到一个文件中,所以命令是:

 tail --follow=name file.txt | grep something > output.txt 

解决方法是使用script命令,如下所示:

 script -c 'tail --follow=name file.txt | grep something' output.txt 

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

这有效地解决了我的问题,我已经解释了为什么命令没有按预期工作,问题解决了。

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

你知道tail默认启动最后十行的文件? 我的猜测是cat版本发现的一切都很好。 试试tail -n+1 --follow=name file.txt从文件开头开始。

在Mac上为我工作没有--follow=name

 bash-3.2$ tail delme.txt | grep po position.bin position.lrn bash-3.2$ tail delme.txt | grep po | grep lr position.lrn 

grep模式文件名| grep模式| grep模式| grep模式……