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