Как "grep" непрерывный поток?

можно использовать grep на непрерывном потоке?

что я имею в виду что-то вроде

10 ответов


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

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

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


Я использую tail -f <file> | grep <pattern> все время.

он будет ждать, пока grep смывает, а не до тех пор, пока он не закончит (я использую Ubuntu).


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

tail -f file | stdbuf -o0 grep my_pattern

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


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

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

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

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

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

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


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

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

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

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


не видел, чтобы кто-нибудь предлагал мой обычный go-to для этого:

less +F <file>
ctrl + c
/<search term>
<enter>
shift + f

Я предпочитаю это, потому что вы можете использовать ctrl + c для остановки и навигации по файлу, когда, а затем просто нажмите shift + f чтобы вернуться к живому потоковому поиску.


Да, это действительно будет работать просто отлично. Grep и большинство команд Unix работают на потоках по одной строке за раз. Каждая линия, которая выходит из хвоста, будет проанализирована и передана, если она соответствует.


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

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

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

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

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


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

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

tail -f <file> | grep pattern

вот как вы бы использовали awk

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