Назад | Перейти на главную страницу

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

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

«ЭЛБ», «Пингдом», «Здоровье»

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

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

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

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

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

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

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

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

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

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

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

Редактировать: Видеть Ответ DTests и комментарии для полного объяснения того, как egrep - это просто устаревший альтернативный способ запустить grep -E.

tail -f /path/to/log | egrep -v 'ELB|Pingdom|Health'

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

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

Если вы хотите иметь сценарий поведения в зависимости от содержимого файлов журнала, вы можете выполнить фильтрацию с помощью 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, и вы указываете другое поведение, и вы можете обернуть все это в цикл, и вы можете легко написать очень мощные фильтры, которые также записывают части вашего ввода в разные файлы или вообще отбрасывают его, или выполните действия и запустите другие сценарии в зависимости от того, что введено вами.

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