Как "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 }'