我正在尝试通过几个过滤器来追踪 apache 错误日志。
这非常有效:
tail -fn0 /var/log/apache2/error.log | egrep -v "PHP Notice|File does not exist"
但是输出中有一些文字“\n”,我想用实际的新行替换,所以我通过管道输入 perl:
tail -fn0 /var/log/apache2/error.log | egrep -v "PHP Notice|File does not exist" | perl -ne 's/\\n/\n/g; print"$_"'
这似乎有一些缓存问题(第一页命中没有产生任何结果,第二页命中并且出现了两份调试信息),它似乎也有点喜怒无常。
所以我尝试了 sed:
tail -fn0 /var/log/apache2/error.log | egrep -v "PHP Notice|File does not exist" | sed 's/\\n/\n/g'
似乎遇到了同样的问题。
最佳答案
正确,当您使用大多数程序来归档或通过管道传输时,它们会缓冲输出。在某些情况下您可以控制它:GNU grep
系列接受 --line-buffered
选项,专门用于像这样的管道。此外,在 Perl 中,您可以使用 $| = 1;
效果相同。 (据我所知,sed
没有任何此类选项。)
缓冲的是管道开头或中间的内容,而不是结尾(它正在与您的终端通信,因此它将被行缓冲)所以您想使用 egrep --line-buffered
。
关于linux - 在 CLI 程序之间通过管道传输输出时出现缓冲问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5503084/