grep и tail -f?

28

Можно ли сделать tail -f(или подобное) для файла, и grepэто в то же время? Я не против других команд, просто ищущих такое поведение.

xenoterracide
источник

Ответы:

46

Используя GNU tailи GNU grep, я могу tail -fиспользовать простой синтаксис:

tail -f /var/log/file.log | grep search_term
Стивен Д
источник
Это решение, которое работает с другими реализациями этих двух утилит, а не только с реализацией GNU.
Кусалананда
7

Это будет работать нормально; в общем, grepбудет ждать, когда программа не выводит, и продолжит читать, когда поступит вывод, так что если вы делаете:

$ (echo foo; sleep 5; echo test; sleep 5) | grep test

Ничего не произойдет в течение 5 секунд, затем grep выдаст соответствующий «тест», а затем через пять секунд он завершится, когда процесс по конвейеру выполнит

Михаил Мрозек
источник
7

Добавить --line-bufferedк grep, и это может уменьшить задержку для вас. Очень полезно в некоторых случаях.

tail -f foo | grep --line-buffered bar
цифра
источник
2
Это полезно, когда вывод grepне идет в терминал (перенаправляется в файл другого типа). Строковая буферизация используется по умолчанию, когда вывод поступает на терминал, поэтому в этом нет никакой разницы. Обратите внимание, что эта опция специфична для GNU.
Стефан Шазелас
2

Я вижу, как все эти люди говорят использовать tail -f, но мне не нравятся ограничения этого! Мой любимый метод поиска файла с одновременным отслеживанием новых строк (например, я обычно работаю с файлами журналов, к которым добавляются перенаправленные выходные данные процессов, периодически выполняемых с помощью заданий cron):

 tail -Fn+0 /path/to/file|grep searchterm

Это предполагает GNU tail и grep. Вспомогательные подробности из хвостовой man-страницы (GNU coreutils, у меня v8.22) [ https://www.gnu.org/software/coreutils/manual/coreutils.html] :

 -F     same as --follow=name --retry
 -n, --lines=K
         output the last K lines, instead of the last 10; or use -n +K to output
         starting with the Kth.
         If  the first character of K (the number of bytes or lines)
         is a '+', print beginning with the Kth item from the start
         of each file, otherwise, print the last K items in the file.
         K may have a multiplier suffix: b 512, kB 1000, K 1024, MB
         1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024,
         and so on for T, P, E, Z, Y.

  With --follow (-f), tail defaults to following the file descriptor,
  which means that even if a tail'ed file is renamed, tail will
  continue to track its end.  This default behavior is  not  desirable
  when  you  really  want  to  track the actual name of the file, not
  the file descriptor (e.g., log rotation).  Use --follow=name in
  that case.  That causes tail to track the named file in a way that
  accommodates renaming, removal and creation.

Таким образом, хвостовая часть моей команды приравнивается к тому tail --follow --retry --lines=+0, где последний аргумент указывает на начало в начале, пропуская ноль строк.

wajiii
источник
1
tail -f access | awk '/ADD/{print $0}'

Используйте выше, я использую это обычно.


источник
0

Вы можете использовать netcat для получения результатов tail -f, так как новые результаты появляются довольно легко.

sudo nc -s localhost -l -p 1337 | grep ssh


tail -f /var/log/file.log | nc 127.0.0.1 1337

Это устанавливает grep для прослушивания результатов ввода, поступающего из порта 1337.
Вторая команда направляет вывод tail -f в netcat и отправляет его localhost 1337. Чтобы сделать это локально, вам нужно переключить ttys для каждого из двух наборов команд. или используйте что-то вроде экрана.

Джастин С
источник
0

Оно работает. Но позаботьтесь о том, чтобы вывод больше не был мгновенным: он буферизовался через канал.

mouviciel
источник
Согласовано. Чтобы проверить это, откройте два окна. Запустите tail -fв одном окне, а tail -f logfile | grep patternв другом окне. Строки, содержащие patternне всегда появляются в обоих окнах одновременно. Я видел, как линии появляются на расстоянии 30 секунд в редких случаях, что раздражало.
Стефан Ласевский
Это может быть больше связано с переключением системы между запуском одного или другого экземпляра tail. Лучше проверить нас teeили что-то в этом роде.
Кевин Канту