Хвост -f в grep в разрез не работает должным образом

Я пытаюсь создать оболочку script для мониторинга некоторых файлов журналов. Я использую такую ​​команду:

tail -f /var/somelog | grep --line-buffered " some test and p l a c e h o l d e r" | cut -f 3,4,14 -d " "

файл журнала похож:

some test and p l a c e h o l d e r 3
some test and p l a c e h o l d e r 4
some test and p l a c e h o l d e r 5
some test and p l a c e h o l d e r 6

и т.д.. Моя проблема заключается в том, что вывод команды не отображает последнюю строку

some test and p l a c e h o l d e r 6

до строки

some test and p l a c e h o l d e r 7

добавляется в журнал.

Надеюсь, я разъяснил свою проблему. Может ли кто-нибудь помочь мне решить эту проблему? Спасибо:)

Ответ 1

проблема почти наверняка связана с тем, как grep и cut буфером их вывод. вот хак, который должен помочь вам решить проблему, хотя я уверен, что есть более красивые способы сделать это:

tail -f /var/somelog | while read line; do echo "$line" | grep "some test and p l a c e h o l d e r" | cut -f 3,4,14 -d " "; done

(не забывайте ; done в конце команды)

в качестве альтернативы, поскольку gawk не выполняет буферизацию вывода, вы можете использовать его вместо cut, чтобы избежать громоздкого цикла while:

tail -f log | grep --line-buffered "some test and p l a c e h o l d e r" | gawk '{print $3,$4,$14}'

просмотрите http://www.pixelbeat.org/programming/stdio_buffering/ для получения дополнительной информации о проблемах с буферизацией.