Perl: чтение из канала 'tail -f' через STDIN - PullRequest
6 голосов
/ 09 ноября 2011

Был ряд других потоков, подобных этому, но обычным выводом было что-то вроде "Install File :: Tail".Но я на старой коробке, которую мы выводим из эксплуатации, и я просто хочу написать однострочник для мониторинга журнала.Я попытался установить File :: Tail, но среда для CPAN просто не работает, и я не хочу тратить время на то, чтобы выяснить, в чем проблема.

Я просто хочу базовый скрипт, которыйразбирает IP-адрес и ведет подсчет для меня.По какой-то причине, однако, даже этот простой тест не работает:

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

Я думаю, что это как-то связано с буферизацией вывода, но я всегда был немного неясен, как это работает.Как я могу заставить этот однострочный работать?

Ответы [ 3 ]

10 голосов
/ 09 ноября 2011

tail -f обычно не буферизует вывод, но grep, вероятно, делает.Перенесите функциональность "grep" в свой Perl с одним вкладышем:

tail -f snmplistener.log | perl -ne 'print "LINE: $_\n" if /IPaddress/'
2 голосов
/ 20 декабря 2011

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 ...
1 голос
/ 09 ноября 2011

Или вообще без хвоста:

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