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