在CLI程序之间管道输出时出现缓冲问题

时间:2011-03-31 16:23:06

标签: linux perl sed grep command-line-interface

我正试图通过几个过滤器来追踪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'

似乎遇到了同样的问题。

2 个答案:

答案 0 :(得分:4)

正确,当您使用大多数程序来文件或管道时,它们缓冲输出。在某些情况下,您可以控制它:GNU grep系列接受--line-buffered选项,专门用于此类管道。此外,在Perl中,您可以使用$| = 1;获得相同的效果。 (sed没有任何我知道的选项。)

管道的开头或中间的东西将是缓冲,而不是结束(它与你的终端通话,因此它将被缓冲),所以你想使用egrep --line-buffered

答案 1 :(得分:1)

看起来你可以在-d中使用-u,如下所示:

tail -f myLog | sed -u "s/\(joelog\)/^[[46;1m\1^[[0m/g" | sed -u 's/\\n/\n/g'

用于记录日志,突出显示'joelog',然后添加换行符,其中有'\ n'

源: http://www-01.ibm.com/support/docview.wss?uid=isg1IZ42070