Perl:通过STDIN从'tail -f'管道读取

时间:2011-11-09 19:15:12

标签: perl stdin tail output-buffering

还有很多其他类似的线程,但通常的结论是“Install File :: Tail”。但是,我在一个旧盒子上,我们正在退役,我只想写一个单行来监视日志。我尝试安装File :: Tail,但CPAN的环境不起作用,我不想花时间弄清问题是什么。

我只想要一个基本脚本来解析一个IP地址并为我保留一个计数。但是,出于某种原因,即使这个简单的测试也不起作用:

$ tail -f snmplistener.log|grep IPaddress |perl -ne 'print "LINE: $_\n";'

我认为它与输出缓冲有关,但我总是对它的工作原理有点模糊。我怎样才能使这个单线工作?

3 个答案:

答案 0 :(得分:10)

tail -f通常不会缓冲输出,但grep可能会这样做。将“grep”功能移动到Perl one-liner中:

tail -f snmplistener.log | perl -ne 'print "LINE: $_\n" if /IPaddress/'

答案 1 :(得分:2)

man grep

--line-buffered
      Use line buffering on output.  This can cause a performance penalty.

这样:

tail -f /log/file.txt | grep --line-buffered SomePattern | perl ...

答案 2 :(得分:1)

或者根本不使用尾巴:

perl -e 'open($h,$ARGV[0]); while (1) { /IPaddress/ and print "LINE: $_" for <$h>; sleep 1 }' snmplistener.log