В tail -f как отфильтровать материал с определенными ключевыми словами?

39

Я хочу, чтобы tail -fмои журналы. Однако я хочу отфильтровать все, что имеет слова:

"ELB", "Pingdom", "Здоровье"

Alex
источник
2
С vanheusden.com/multitail вы можете раскрашивать важные вещи или отфильтровывать вещи, которые вы не хотите видеть, например, config pantz.org/software/multitail/multitailconfig.html
oluies

Ответы:

58

Я не знаю об использовании awk вместо grep, но это работает для меня:

tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'

РЕДАКТИРОВАТЬ: Как указали dmourati и Caleb , вы могли бы также использовать egrepвместо grep -Eдля удобства. В некоторых системах это будет ссылка на тот же двоичный файл, в других - его копия, предоставляемая пакетом grep. В любом случае это альтернатива -Eкоммутатору. Однако, согласно странице руководства GNU grep:

[…] Две версии программы egrepи fgrepдоступны. egrepтак же, как grep -E. fgrepтак же, как grep -F. Прямой вызов как egrepили fgrepустарел, но предоставляется, чтобы позволить историческим приложениям, которые полагаются на них, работать без изменений.

Поскольку они являются синонимичными командами, все сводится к предпочтениям, если у вас вообще нет egrep. Однако для прямой совместимости рекомендуется использовать grep -Eсинтаксис, поскольку другой метод официально не рекомендуется.

DTest
источник
Использование grep -Eвместо egrepгарантии повторного ответа?
Калеб
@ Калеб Я не понимаю, почему нет. Существует несколько способов
убрать
1
Да, но это просто символические ссылки друг на друга, а не две разные программы с некоторым функциональным перекрытием. Так не будет ли это больше «приложением» (читай: комментарий), а не полноценным ответом? У меня были отрицательные голоса за мелкие нарушения ...
Марчин
@DTest: По праву dmourati фактически избил меня до удара за пару секунд, и хотя он не объяснил причину, он заслуживает некоторого уважения здесь. Вы явно опоздали на вечеринку, поскольку у нас обоих было по крайней мере два возражения, прежде чем вы пришли. Изменение синтаксиса двоичного файла с символьными ссылками на аргумент обычно является чем-то, для чего вы бы использовали комментарий, а не отдельный ответ. Если вы хотите , чтобы кожа кошки по- разному использовать sed, awk, perl, multitailили ninja_foo.
Калеб
1
@DTest: Я позволил себе внести существенные правдоподобные изменения в ваш ответ, чтобы добавить некоторые оригинальные источники. Похоже, -E рекомендуется для использования в будущем, поэтому я отметил это, но удалил ваше примечание о дистрибутивах, у которых нет egrep. В упомянутом дистрибутиве есть egrep, это просто отдельный двоичный файл вместо символической ссылки.
Калеб
21

Попробуйте передать его в egrep со списком слов, разделенных конвейером, которые вы хотите отфильтровать:

tail -f log_file | egrep -v 'ELB|Pingdom|Health'

Обратите внимание, что использование круглых скобок в списке совпадений не является обязательным. Поскольку |grep обрабатывается как логический оператор OR независимо от того, происходит ли он как часть подгруппы или нет. '(ELB|Pingdom|Health)'будет функционировать точно так же. Для некоторых синтаксис может быть более очевидным; Мне легче набирать текст, так как я могу переключаться с одного совпадения на список возможных совпадений, не возвращаясь к скобкам.

Для дополнительной информации стоит упомянуть, что это multitailделает ninja foo, когда дело доходит до фильтрации выходных данных. Например, вы можете отфильтровать слова так:

multitail -e ELB -e Pingdom -e Health -f log_file

Вы также можете использовать его, чтобы раскрасить или иначе выделить результат, вместо того, чтобы просто фильтровать его.

РЕДАКТИРОВАТЬ: См. Ответ DTests и комментарии для полного объяснения того, как egrep является устаревшим альтернативным способом запускаgrep -E .

Калеб
источник
2
не должно ли выражение заканчиваться на ('), а не на (")?
bbaja42
Да, спасибо, что это была опечатка. Для дальнейшего использования, так как сайты обмена стеками функционируют как вики, вот такую ​​вещь вы можете просто исправить.
Калеб
Я думал, что редактирование должно быть более 6 символов?
Sirex
Если у вас нет высокого повторения, да, минимум 6 символов, но в этом случае 1 символ очень важен. Вы можете принудительно внести изменения, добавив HTML-комментарий к телу. Персонажи будут учитываться в пределе, и вы можете заметить, почему вы делаете изменения.
Калеб
@Caleb большое спасибо за предложение о множественном хвосте, это потрясающе !! Не могу поверить, что я так долго в жизни жил без этого.
sidewinderguy
5
tail -f /path/to/log | egrep -v 'ELB|Pingdom|Health'
dmourati
источник
3

Почему вы хотите записать эту информацию?

  • Это строго для архива?
  • Вы хотите условно выполнять разные сценарии в зависимости от разных ключевых слов или шаблонов в файлах журнала?

Если вы хотите, чтобы поведение сценариев зависело от содержимого файлов журнала, вы можете выполнить фильтрацию с помощью Expect. ( http://en.wikipedia.org/wiki/Expect ) Expect является расширением Tcl, но существует также версия Expect для Python.

Expect предоставляет вам это мощное гибкое предложение типа switch, которое позволяет вам задавать различные варианты поведения в зависимости от состояний или шаблонов, присутствующих в вашем входном потоке. Например:

expect {  
    "password:" {  
        send "password\r"  
    } 
    "yes/no)?" {  
        send "yes\r"  
        set timeout -1  
    }  
    timeout {  
        exit  
    }   
    -re . {  
        exp_continue  
    }  
    eof {  
        exit  
    }  
}

Таким образом, вы задаете шаблоны в операторе ожидаемого, и вы задаете различные поведения, и вы можете заключить все это в цикл, и вы можете легко написать очень мощные фильтры, которые также записывают части вашего ввода в разные файлы, или вообще отбрасывать его, или выполняйте действия и запускайте другие сценарии в зависимости от того, что вы вводите.

Итак, все сводится к тому, почему вы пытаетесь отфильтровать файлы журнала, принять меры по вводу журнала или просто по архивным причинам?

Джерри Ашер
источник
Плюс один за ссылку на Expect, которую я использовал довольно давно и о которой совсем забыл.
MPi