为什么它无法在 Linux 中使用" tail -fn0 output.log | grep error >> error.log "



我想写一个shell脚本来监视我的日志

我写的一些方法

tail -fn0 output.log | grep error >> error.log

将不会输出包含"0"的日志;错误";至error.log

如果我写

tail -fn0 output.log | 
while read line ; do
echo "$line" | grep error >>error.log
done

它将完美地工作

我只是想知道为什么我不能像一样写作

tail -fn0 output.log | grep error >> error.log

它是如何工作的?

您需要使用grep --line-buffered:

tail -f output.log | grep --line-buffered error >> error.log

要复制解决方案,请使用以下示例:

for i in `seq 1 10` ; do echo "error $i"; sleep 10; done > output.log &
rm error.log
tail -f output.log | grep --line-buffered error >> error.log &
head output.log error.log

输出:

head output.log error.log
==> output.log <==
error 1
error 2
error 3
...
==> error.log <==
error 1
error 2
error 3
...

另请参阅:

grep手动

--line-buffered
对标准输出使用行缓冲,而不考虑输出设备。默认情况下,标准输出为交互式设备,并且在其他情况下被完全缓冲。已满缓冲,输出缓冲区在满时被刷新;带线条缓冲,缓冲区也会在每一个输出行之后刷新。这个缓冲区大小取决于系统。

最新更新