我正试图通过几个过滤器来追踪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'
似乎遇到了同样的问题。
答案 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