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

时间:2011-03-25 01:09:12

标签: linux file command-line grep pipe

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

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

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

cat file.txt | grep something | grep something_else

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

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

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

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

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

没有显示输出。

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

5 个答案:

答案 0 :(得分:87)

在管道内部,您可能还遇到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

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

答案 1 :(得分:6)

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

应该注意这是正确的:

tail file.txt | grep something | grep something

--follow=name文件的以下内容存在问题。

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

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

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

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

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

这对我有效解决了这个问题,我已经解释了为什么命令没有按照我的预期运行,问题解决了。

仅供参考,这些其他stackoverflow问题是相关的:
Trick an application into thinking its stdin is interactive, not a pipe
Force another program's standard output to be unbuffered using Python

答案 2 :(得分:-1)

你知道tail默认启动文件的最后十行吗?我的猜测是cat版本找到的所有内容都是过去的。尝试tail -n+1 --follow=name file.txt从文件的开头开始。

答案 3 :(得分:-1)

在没有--follow=name

的Mac上适合我
bash-3.2$ tail delme.txt | grep po
position.bin
position.lrn
bash-3.2$ tail delme.txt | grep po | grep lr
position.lrn

答案 4 :(得分:-1)

grep pattern filename | grep模式| grep模式| grep模式......