Просмотр файлов без строк с определенной строкой

12

Поиск такой программы, как tailили lessкоторая позволяет мне просматривать мои журналы без строк, которые содержат определенную строку. Например, просмотрите мой системный журнал без [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
Arronical
источник
2
Вы также можете использовать fgrepкоманду, которая эквивалентна grep -F.
Тулаинс Кордова
2
@ TulainsCórdova grep говорит, что «прямой вызов как 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
    
terdon
источник
2

Вы также можете использовать awk:

awk '!/PATTERN/' log

Я использую его, когда у меня больше, чем один «шаблон», и я не хочу использовать два grepтипа:

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

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

awk '!/PATTERN/ && !/PATTERN2/' log
Ravexina
источник
«Я использую его, когда у меня больше, чем один« шаблон », и я не хочу использовать два типа grep» ------ grep -Ev "foo|bar"?
αғsнιη
Вы также можете использовать -eдля определения нескольких шаблонов. grep -v -e 'foo' -e 'bar'
Arronical
@AFSHIN (Не знаю, как мой комментарий удаляется), я имел в виду для логического, а не или;)
Ravexina
1

С lessкомандованием &опцией можно отфильтровать , чтобы отобразить только нужный подходящий шаблон , как показано ниже,

& /PATTERN/

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

&! /UFW BLOCK/
αғsнιη
источник