Можно ли сделать tail -f
(или подобное) для файла, и grep
это в то же время? Я не против других команд, просто ищущих такое поведение.
Можно ли сделать tail -f
(или подобное) для файла, и grep
это в то же время? Я не против других команд, просто ищущих такое поведение.
Ответы:
Это будет работать нормально; в общем, grep
будет ждать, когда программа не выводит, и продолжит читать, когда поступит вывод, так что если вы делаете:
$ (echo foo; sleep 5; echo test; sleep 5) | grep test
Ничего не произойдет в течение 5 секунд, затем grep выдаст соответствующий «тест», а затем через пять секунд он завершится, когда процесс по конвейеру выполнит
Добавить --line-buffered
к grep
, и это может уменьшить задержку для вас. Очень полезно в некоторых случаях.
tail -f foo | grep --line-buffered bar
grep
не идет в терминал (перенаправляется в файл другого типа). Строковая буферизация используется по умолчанию, когда вывод поступает на терминал, поэтому в этом нет никакой разницы. Обратите внимание, что эта опция специфична для GNU.
Вы можете просто передать вывод grep
вtail -f
. Существуют также программы, сочетающие tail -f
функциональность с фильтрацией и раскраской, в частности многозадачность ( примеры ).
Я вижу, как все эти люди говорят использовать 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
, где последний аргумент указывает на начало в начале, пропуская ноль строк.
tail -f access | awk '/ADD/{print $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 для каждого из двух наборов команд. или используйте что-то вроде экрана.
Оно работает. Но позаботьтесь о том, чтобы вывод больше не был мгновенным: он буферизовался через канал.
tail -f
в одном окне, а tail -f logfile | grep pattern
в другом окне. Строки, содержащие pattern
не всегда появляются в обоих окнах одновременно. Я видел, как линии появляются на расстоянии 30 секунд в редких случаях, что раздражало.
tee
или что-то в этом роде.