如果我以某种方式跟踪一个文件,如下所示:
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
STDOUT
for 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