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