为什么两次使用grep没有输出?

问题描述 投票:0回答:6

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

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

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

cat file.txt | grep something | grep something_else

看来你不能多次通过管道传输 tail 的输出!?有人知道这是什么交易吗?有解决办法吗?

编辑: 为了回答到目前为止的问题,该文件肯定包含 grep 应该显示的内容。作为 grep 是否像这样完成的证据:

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

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

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

未显示任何输出。

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

linux file command-line grep pipe
6个回答
99
投票

在管道内时,您也可能会遇到 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 文件中,这非常有用。


7
投票

弄清楚这里发生了什么。事实证明,该命令正在运行,只是输出需要很长时间才能到达控制台(在我的例子中大约需要 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 问题是相关的:
欺骗应用程序认为其标准输入是交互式的,而不是管道
使用 Python 强制另一个程序的标准输出不被缓冲


0
投票

这也是 Fish shell 的问题,调用“grep”会调用

/usr/share/fish/functions/grep.fish
,而第二个 grep 根本没有运行,例如:

>> sudo tail -f /var/log/syslog | grep kernel | grep --nonexistentoption

不产生任何输出。 那么解决办法就是

sudo rm /usr/share/fish/functions/grep.fish


-1
投票

您确实知道

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


-1
投票

在 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

-1
投票

grep 模式文件名 | grep 模式 | grep 模式 | grep 模式......

© www.soinside.com 2019 - 2024. All rights reserved.