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