关于linux:为什么两次使用grep时没有显示输出?

Why no output is shown when using grep twice?

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

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

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

1
cat file.txt | grep something | grep something_else

看来你不能再用一次管道输送尾巴的输出了!?有人知道交易是什么,有解决方案吗?

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

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

输出显示正确,但如果使用此选项:

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

未显示输出。

如果有任何帮助,我会运行Ubuntu 10.04


在管道中时,还可能会遇到grep缓冲的问题。也就是说,你看不到

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

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

使用grep的--line缓冲开关来解决这个问题:

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

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


知道这里发生了什么。结果发现命令正在工作,只是输出需要很长时间才能到达控制台(在我的例子中大约是120秒)。这是因为标准输出上的缓冲区不是写每一行,而是写每一个块。所以,我不会像写文件那样从文件中得到每一行,而是每隔2分钟左右得到一个巨大的数据块。

应该注意的是,这是正确的:

1
tail file.txt | grep something | grep something

--follow=name的文件中,有以下问题。

出于我的目的,我找到了一种解决方法,我打算将第一个grep的输出捕获到一个文件中,所以命令是:

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

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

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

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

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

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


grep pattern文件名grep pattern grep pattern grep pattern……


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

1
2
3
4
5
bash-3.2$ tail delme.txt | grep po
position.bin
position.lrn
bash-3.2$ tail delme.txt | grep po | grep lr
position.lrn


你知道tail默认以文件的最后十行开始吗?我的猜测是,cat版本所发现的一切都已经成为过去。尝试从文件的开头开始执行tail -n+1 --follow=name file.txt