tail -f path
Вышеприведенное приведёт к немедленному выводу изменений в файл, но я хочу применить фильтр к выводу, показывать только тогда, когда в нем есть ключевое слово xxx
.
Как подойти к этому?
tail -f path
Вышеприведенное приведёт к немедленному выводу изменений в файл, но я хочу применить фильтр к выводу, показывать только тогда, когда в нем есть ключевое слово xxx
.
Как подойти к этому?
Ответы:
С Unix вы можете направить вывод одной программы в другую.
Так что для фильтрации tail вы можете использовать grep:
tail -f path | grep your-search-filter
Краткий ответ: tail -f somefile | grep somepattern
Тем не менее, это, как правило, не хватает. Допустим, вы отслеживаете файл, который часто поворачивается (если это журнал отладки, он может вращаться несколько раз). В этом случае tail -F
твой друг. Я позволю тебе посмотреть разницу.
Но tail -f
и tail -F
распечатать кучу линий первых, что часто нежелательно в этом сценарии использования, так как в этом случае оных-n0
tail -F -n0 somefile | grep somepattern
Это будет хорошо до тех пор, пока вы не захотите сделать какую-то другую фильтрацию, а затем вам нужно остерегаться буферизации. stdout буферизуется по умолчанию при записи в терминал, но при полной буферизации при записи в канал. Таким образом, следующее будет испускать строки, как только они будут найдены, потому что они tail
явно буферизуются (или сбрасывают свои выходные данные в конце каждой строки), а grep
также буферизуются, потому что их выходные данные отправляются на ваш терминал:
tail -F -n0 somefile | grep somepattern
Но затем вы решаете использовать что-то подобное awk
или cut
для дальнейшей обработки вывода.
tail -F -n0 somefile | grep somepattern | awk '{print $3}'
И теперь вы задаетесь вопросом, куда ушли ваши выходные данные ... в зависимости от объема журналов вы можете обнаружить, что вы получаете выходные данные, но это будет страница за раз, потому что теперь стандартный вывод grep
работает в полностью буферизованном виде, и таким образом awk
получает это ввод 4kB за один раз (по умолчанию).
В этом случае вы можете указать grep
всегда делать буферизованную строку stdout, используя --line-buffered
опцию.
tail -F -n0 somefile | grep --line-buffered somepattern | ...
Однако большинство команд не имеют аналога --line-buffered
. В случае более скриптовых инструментов вы можете использовать функцию для очистки вывода (например, in awk
, функция is fflush()
, которая имеет то же имя, что и ее аналог C, инструменты, такие как Perl и Python, имеют нечто подобное).
С такими cut
как ты скорее всего не повезло; ... но вы можете попробовать поискать unbuffer
, что, я думаю, что-то, предоставленное expect
набором инструментов (я никогда не использовал его).
Я надеюсь, что вы нашли это полезным.
Ура, Кэмерон
и вы можете использовать несколько каналов и greps, исключать вещи с помощью grep -v, получать регистр нечувствительности с помощью grep -i и т. д.
то есть: tail -100f / var / log / messages | grep -V ACPI | grep -i ata
начните с конца 100 строк и продолжайте хвост, сначала исключите все строки с ACPI, затем покажите строки с ata, ATA или любым их сочетанием.
Другой удобный вариант - это варианты ABC для строк After, Before и Context (строки до и после).