Переглядайте файли без рядків з певним рядком


12

Пошук програми , як tailі lessякі дозволяють мені оглянути мої журнали без рядків, що містять певну рядок. Наприклад, перегляньте мій syslog без [UFW BLOCK]рядків вводу UFW ( ).


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

Відповіді:


13

Опція інверсії матчу шаблону -vдля grepдуже корисно для цього:

grep -v 'UFW BLOCK' /var/log/syslog

Це покаже вам всі рядки, які не містять UFW BLOCK. Оскільки grepвикористовуються основні регулярні вирази за замовчуванням, включення дужок змусить шукати будь-який з окремих символів 'UFW BLOCK', включаючи пробіл. Ви, ймовірно, не отримаєте жодного результату. Якщо вам потрібно переконатися, що навколо рядка є дужки, або відімкніть їх \[UFW BLOCK\], або скористайтеся -Fопцією grepвключення лише фіксованих рядків (Спасибі Zanna та Steeldriver за поради з цього приводу):

grep -Fv '[UFW BLOCK]' /var/log/syslog

Ви можете полегшити перегляд, підключивши вихід до пейджера, наприклад less:

grep -v 'UFW BLOCK' /var/log/syslog | less

Або перенаправити вихід на файл у домашній каталог для подальшого перегляду:

grep -v 'UFW BLOCK' /var/log/syslog > ~/filtered_syslog

2
Ви також можете використовувати fgrepкоманду, еквівалентну grep -F.
Тулен Кордова

2
@ TulainsCórdova grep man каже, що "Пряме виклик як egrep або fgrep застаріле, але надається, щоб дозволити історичним програмам, які покладаються на них, працювати без змін". Я не знаю, чи коли-небудь вони будуть діяти на цій депресії, але я думаю, що використання цих команд не найкраща практика
Аарон

5

Ви також можете використовувати sed«s dкоманду , щоб видалити рядки з шаблоном з потоку:

sed '/\[UFW BLOCK\]/d' /var/log/syslog

Ми рятуємося так, []як зазвичай вони позначають клас персонажів, що означає "відповідати будь-чому тут"


5

Ви можете використовувати будь-який інструмент з можливостями редагування. Ви вже отримали рішення, використовуючи, grepі sedось кілька інших варіантів. Всі вони можуть бути легко конвеєр lessабо moreабо що - небудь ще.

  1. Perl

    perl -ne 'print unless /\[UFW BLOCK\]/' /var/log/syslog
    

    Оскільки це Perl, TIMTOWDI! .

    perl -pe '$_="" if /\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ || print' /var/log/syslog
    perl -ne 'print if !/\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '!/\[UFW BLOCK\]/ && print' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ ? "" : print' /var/log/syslog
    
  2. awk

    awk '!/\[UFW BLOCK\]/' file
    

2

Ви також можете використовувати awk:

awk '!/PATTERN/' log

Я використовую його, коли у мене більше одного "шаблону", і я не хочу використовувати два grepтаких:

... | grep -v foo | grep -v bar

який синтаксис:

awk '!/PATTERN/ && !/PATTERN2/' log

"Я використовую його, коли в мене більше одного" шаблону ", і я не хочу використовувати два грепи, наприклад" ------ grep -Ev "foo|bar"? "
αғsnιη

Ви також можете використовувати -eдля визначення декількох шаблонів. grep -v -e 'foo' -e 'bar'
Арронічний

@AFSHIN (Не знаю, як видалити мій коментар), я мав на увазі логічне, а не
;;

1

За lessдопомогою &параметра команди можна відфільтрувати, щоб відобразити лише потрібний відповідний візерунок, як показано нижче,

& /PATTERN/

у вашому випадку, якщо ви хочете, щоб лінії фільтра з UFW BLOCKне відображалися у вихідних даних, ви можете просто скористатися &!як нижче:

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