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