在 tail -f 上双重 grep 没有输出

在 tail -f 上双重 grep 没有输出

如果我以某种方式跟踪一个文件,如下所示:

tail -f  /var/log/syslog|grep s

我看到所有包含“s”的行

如果我再次将其 grep 到相同的“s”,为什么不会给出任何输出?

tail -f  /var/log/syslog|grep s|grep s

答案1

--line-buffered正如 Rubo77 提到的,通过将以下命令添加到第一个 grep 命令即可解决该问题:

tail -f  /var/log/syslog|grep --line-buffered s|grep s

grep但是,您可能会问,为什么单个命令不需要这样做?两者的区别在于下面的命令:

tail -f  /var/log/syslog|grep s

STDOUTfor grep 指向一个终端。 最有可能通过 stdio 库中包含的函数grep进行写入。STDOUT根据文档(标准输入输出(3)):

默认情况下,引用终端设备的输出流始终是行缓冲的;

因此,底层库调用会在每行之后刷新缓冲区,而 grep 则无需执行任何操作。

在此命令中:

tail -f  /var/log/syslog|grep --line-buffered s|grep s

STDIO现在进入管道而不是终端设备,并且 grep 用于写入 STDOUT 的库函数完全缓冲这些写入而不是使用行缓冲。--line-buffered使用该标志时,grep 将调用fflush,这将刷新所有缓冲的写入。

答案2

您需要添加--line-buffered到 grep

tail -f  /var/log/syslog|grep --line-buffered s|grep s

相关内容