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


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

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

10 591

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 использует некоторую буферизацию вывода. Попробуй

tail -f file | stdbuf -o0 grep my_pattern

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

В большинстве случаев, вы можете 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>

The -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, где у вас нет опции буферизации линии! Он будет непрерывно передавать ваши данные из хвоста.

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

tail -f <file> | grep pattern

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

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