Я хочу, чтобы tail -f
мои журналы. Однако я хочу отфильтровать все, что имеет слова:
"ELB", "Pingdom", "Здоровье"
Я хочу, чтобы tail -f
мои журналы. Однако я хочу отфильтровать все, что имеет слова:
"ELB", "Pingdom", "Здоровье"
Ответы:
Я не знаю об использовании 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
синтаксис, поскольку другой метод официально не рекомендуется.
grep -E
вместо egrep
гарантии повторного ответа?
sed
, awk
, perl
, multitail
или ninja_foo
.
Попробуйте передать его в 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
.
Почему вы хотите записать эту информацию?
Если вы хотите, чтобы поведение сценариев зависело от содержимого файлов журнала, вы можете выполнить фильтрацию с помощью 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
}
}
Таким образом, вы задаете шаблоны в операторе ожидаемого, и вы задаете различные поведения, и вы можете заключить все это в цикл, и вы можете легко написать очень мощные фильтры, которые также записывают части вашего ввода в разные файлы, или вообще отбрасывать его, или выполняйте действия и запускайте другие сценарии в зависимости от того, что вы вводите.
Итак, все сводится к тому, почему вы пытаетесь отфильтровать файлы журнала, принять меры по вводу журнала или просто по архивным причинам?