linux - number - grep lookbehind




Как «grep» непрерывный поток? (8)

Можно ли использовать grep для непрерывного потока?

Я имею в виду tail -f <file> команду tail -f <file> , но с grep на выходе, чтобы сохранить только интересующие меня строки.

Я пробовал tail -f <file> | grep pattern tail -f <file> | grep pattern но кажется, что grep можно выполнить только после завершения tail , то есть никогда.


В большинстве случаев вы можете использовать tail -f /var/log/some.log |grep foo и он будет работать нормально.

Если вам нужно использовать несколько greps в работающем файле журнала, и вы обнаружите, что у вас нет выхода, вам может понадобиться --line-buffered ключ --line-buffered к среднему grep (s), например:

tail -f /var/log/some.log | grep --line-buffered foo | grep bar

Включите режим буферизации строк grep при использовании BSD grep (FreeBSD, Mac OS X и т. Д.).

tail -f file | grep --line-buffered my_pattern

Вам не нужно делать это для GNU grep (используется практически для любого Linux), поскольку по умолчанию он будет скрываться (YMMV для других Unix-подобных, таких как SmartOS, AIX или QNX).


Если вы хотите найти совпадения во всем файле (а не только в хвосте), и вы хотите, чтобы он сидел и ждал новых совпадений, это работает хорошо:

tail -c +0 -f <file> | grep --line-buffered <pattern>

Флаг -c +0 говорит, что выход должен начинаться с 0 байта ( -c ) с начала ( + ) файла.


Используйте awk (еще одна полезная утилита bash) вместо grep, где у вас нет опции для буферизации строк! Он будет непрерывно передавать ваши данные из хвоста.

это как вы используете grep

tail -f <file> | grep pattern

Вот как вы будете использовать awk

tail -f <file> | awk '/pattern/{print $0}'

Эта одна команда работает для меня (Suse):

mail-srv:/var/log # tail -f /var/log/mail.info |grep --line-buffered LOGIN  >> logins_to_mail

сбор логинов на почтовую службу


Я думаю, что ваша проблема в том, что grep использует некоторую буферизацию вывода. Пытаться

tail -f file | stdbuf -o0 grep my_pattern

он будет устанавливать режим буферизации вывода grep на небуферизованный.


вы можете рассмотреть этот ответ как улучшение. Обычно я использую

tail -F <fileName> | grep --line-buffered  <pattern> -A 3 -B 5

-F лучше в случае поворота файла (-f не будет работать должным образом, если файл повернут)

-A и -B полезно для получения строк непосредственно перед и после появления шаблона. Эти блоки появятся между разделителями пунктирной линии


sed будет правильной командой (редактор потока )

tail -n0 -f <file> | sed -n '/search string/p'

а затем, если вы хотите, чтобы команда tail вышла, как только вы нашли определенную строку:

tail --pid=$(($BASHPID+1)) -n0 -f <file> | sed -n '/search string/{p; q}'

Очевидно, что башизм: $ BASHPID будет идентификатором процесса команды tail. Команда sed следующая после хвоста в трубе, поэтому идентификатор процесса sed будет $ BASHPID + 1.





tail