Я хочу до tail -f
своїх журналів. Однак я хочу відфільтрувати все, що має слова:
"ELB", "Pingdom", "Health"
Я хочу до tail -f
своїх журналів. Однак я хочу відфільтрувати все, що має слова:
"ELB", "Pingdom", "Health"
Відповіді:
Я не знаю про використання awk замість grep, але це працює для мене:
tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'
EDIT: Як зазначали dmourati та Caleb , ви також можете використовувати egrep
замість grep -E
зручності. У деяких системах це буде посилання на той самий двійковий файл, в інших - його копія, надана пакетом grep. У будь-якому випадку вона живе як альтернатива -E
комутатору. Однак, відповідно до сторінки GNU grep man:
[…] Дві варіанти програми
egrep
таfgrep
доступні.egrep
те саме, щоgrep -E
.fgrep
те саме, щоgrep -F
. Пряме виклик якegrep
абоfgrep
застаріле, але надається, щоб дозволити історичним програмам, які покладаються на них, працювати без змін.
Оскільки вони є синонімальними командами, це зводиться до переваги, якщо у вас зовсім не виникає старість. Однак для сумісності вперед рекомендується використовувати grep -E
синтаксис, оскільки інший метод офіційно застарілий.
grep -E
замість egrep
ордера дублюючу відповідь?
sed
, awk
, perl
, multitail
або ninja_foo
.
Спробуйте перетягнути його, щоб перетворитись на окремі труби списки слів, які ви хочете відфільтрувати:
tail -f log_file | egrep -v 'ELB|Pingdom|Health'
Зауважте, що використання дужок навколо списку збігів необов’язкове. Оскільки |
оператор розглядається як логічний оператор АБО grep, незалежно від того, чи є він частиною підгрупи чи ні. '(ELB|Pingdom|Health)'
функціонував би точно так само. Для деяких синтаксис може бути більш очевидним; Мені легше вводити текст, оскільки я можу перейти з одного збігу до списку можливих збігів, не повертаючись, щоб додати дужки.
Для додаткового кредиту варто згадати, що multitail
робить ніндзя foo, коли справа доходить до фільтрації виводу. Наприклад, ви можете фільтрувати такі слова:
multitail -e ELB -e Pingdom -e Health -f log_file
Ви також можете використовувати його для фарбування або іншим чином виділити вихід, а не просто його фільтрувати.
Редагувати: Дивіться відповідь DTests та коментарі для повного пояснення того, як egrep - це лише устарений альтернативний спосіб звільнення grep -E
.
Чому ви хочете записати цю інформацію?
Якщо ви хочете мати сценарій поведінки залежно від вмісту файлів журналів, можливо, ви захочете виконати фільтрування за допомогою Expect. ( http://en.wikipedia.org/wiki/Expect ) Очікуйте, що це розширення Tcl, але є також версія Python Expect.
Очікує, що ви отримуєте цей потужний гнучкий перемикач типу оператора, який дозволяє вам умовно задавати різні способи поведінки залежно від станів або моделей, наявних у вашому вхідному потоці. Наприклад:
expect {
"password:" {
send "password\r"
}
"yes/no)?" {
send "yes\r"
set timeout -1
}
timeout {
exit
}
-re . {
exp_continue
}
eof {
exit
}
}
Таким чином, ви вказуєте шаблони в операторі очікування, і ви вказуєте різні форми поведінки, і ви можете завернути все в циклі, і ви можете легко написати дуже потужні фільтри, які також записують частини вашого вводу в різні файли, або взагалі скинути їх, або вживати дій та запускати інші сценарії залежно від того, що є у вашому введенні.
Отже, зводиться до того, чому ви намагаєтесь відфільтрувати файли журналів, вжити заходів щодо введення журналу чи просто з архівних причин?