Як хвостити -f, як я фільтрую речі з певними ключовими словами?


39

Я хочу до tail -fсвоїх журналів. Однак я хочу відфільтрувати все, що має слова:

"ELB", "Pingdom", "Health"


2
За допомогою vanheusden.com/multitail ви можете розфарбувати важливі речі або відфільтрувати речі, які ви не хочете бачити, наприклад config pantz.org/software/multitail/multitailconfig.html
oluies

Відповіді:


58

Я не знаю про використання 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ордера дублюючу відповідь?
Калеб

@Caleb Я не бачу, чому ні. Існує більше ніж один спосіб
зібрати

1
Так, але вони просто символізують одна одну, а не дві різні програми з деяким функціональним перекриттям. Тож чи не буде це більше «доповненням» (читайте: коментар), а не повноцінною відповіддю? У мене були поступки на менші правопорушення ...
Марцін

@DTest: По правах dmourati насправді побив мене до удару за пару секунд, і хоча він не пояснив міркування, він заслуговує на деяку заслугу тут. Ви явно запізнювались на вечірку, оскільки у нас обох було щонайменше два анонси, перш ніж ви прийшли. Змінення синтаксису зі зв'язаного бінарного аргументу на аргумент - це звичайно те, для чого ви б використали коментар, а не окрему відповідь. Якщо ви хочете , щоб шкіра кішки по- різному використовувати sed, awk, perl, multitailабо ninja_foo.
Калеб

1
@DTest: Я взяв на себе сміливість внести значну фактичну редакцію у вашу відповідь, щоб додати кілька оригінальних джерел. Схоже, -E рекомендується для подальшого використання, тому я зазначив це, але вилучив вашу примітку про дистрибутиви, які не мають опіки. Згадані райони дистрибуції мають вибух, це лише окремий двійковий файл, а не симпосилання.
Калеб

21

Спробуйте перетягнути його, щоб перетворитись на окремі труби списки слів, які ви хочете відфільтрувати:

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.


2
не повинен вираз закінчуватися на ('), а не на (")?
bbaja42

Так, спасибі це було помилково. Для майбутньої референції, оскільки сайти обміну стеками функціонують як вікі, це те, що ви можете просто виправити.
Калеб

Я думав, що правка повинна бути більше 6 символів?
Сірекс

Якщо у вас немає високої кількості представників, так, це мінімум 6 символів, але в цьому випадку 1 символ дуже важливий. Ви можете примусити зміни, додавши коментар HTML до тіла. Символи будуть рахуватися до межі, і ви можете відзначити, чому ви вносите зміни.
Калеб

@Caleb велике спасибі за багатоповерхівкові пропозиції, що це приголомшливо !! Не можу повірити, що я так довго пройшов у своєму житті без цього.
sidewinderguy


3

Чому ви хочете записати цю інформацію?

  • Це суворо для архіву?
  • Ви хочете умовно виконувати різні сценарії залежно від різних ключових слів або шаблонів у файлах журналу?

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

Таким чином, ви вказуєте шаблони в операторі очікування, і ви вказуєте різні форми поведінки, і ви можете завернути все в циклі, і ви можете легко написати дуже потужні фільтри, які також записують частини вашого вводу в різні файли, або взагалі скинути їх, або вживати дій та запускати інші сценарії залежно від того, що є у вашому введенні.

Отже, зводиться до того, чому ви намагаєтесь відфільтрувати файли журналів, вжити заходів щодо введення журналу чи просто з архівних причин?


Плюс один для посилання на Expect, яким я користувався досить давно і про нього зовсім забув.
MPi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.