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

Замечание о «есть эта нормальная» часть вопроса:

В общем, программное обеспечение с открытым исходным кодом выпускается гораздо чаще, чем коммерческое программное обеспечение. Кроме того, такая система, как Ubuntu, представляет собой большое созвездие «небольших» программных пакетов, которые работают вместе, чтобы обеспечить вам беспрепятственный пользовательский интерфейс. Многие из этих пакетов являются специализированными библиотеками кода, о которых вы, возможно, никогда не знаете, но в конечном итоге делаете то, что полезно для некоторых приложений конечного пользователя. Это один из определяющих символов программного обеспечения с открытым исходным кодом: вместо больших монолитных приложений у вас есть расширенная сеть зависимостей.

В системе, где я пишу это, у меня установлено более 4 000 пакетов, поэтому легко получить хотя бы одно обновление в день.

12
задан 1 August 2017 в 16:45

15 ответов

Опция инверсии соответствия шаблону -v для grep действительно полезна для этого:

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

Это покажет вам все строки, не содержащие UFW BLOCK. Поскольку grep использует стандартные регулярные выражения по умолчанию, включение скобок приведет к поиску любого из отдельных символов «UFW BLOCK», включая пробел. Вероятно, вы не получите выход. Если вам нужно убедиться, что вокруг строки есть скобки, либо сбегите их \[UFW BLOCK\], либо используйте опцию -F в grep, чтобы включить только фиксированные строки (спасибо Zanna и Steeldriver за советы по этому поводу): [ ! d1]

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
13
ответ дан 22 May 2018 в 20:06
  • 1
    Вы также можете использовать команду fgrep, которая эквивалентна grep -F. – Tulains Córdova 28 July 2017 в 08:40
  • 2
    @ TulainsCórdova Мужчина grep говорит, что «Прямой вызов, поскольку egrep или fgrep устарел, но предоставляется, чтобы исторические приложения полагались на них для запуска неизмененных». Я не знаю, будут ли они когда-либо действовать на этом осуждении, но я думаю, что использование этих команд не является лучшей практикой – Aaron 28 July 2017 в 15:21

Опция инверсии соответствия шаблону -v для grep действительно полезна для этого:

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

Это покажет вам все строки, не содержащие UFW BLOCK. Поскольку grep использует стандартные регулярные выражения по умолчанию, включение скобок приведет к поиску любого из отдельных символов «UFW BLOCK», включая пробел. Вероятно, вы не получите выход. Если вам нужно убедиться, что вокруг строки есть скобки, либо сбегите их \[UFW BLOCK\], либо используйте опцию -F в grep, чтобы включить только фиксированные строки (спасибо Zanna и Steeldriver за советы по этому поводу): [ ! d1] 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
13
ответ дан 18 July 2018 в 09:33

Опция инверсии соответствия шаблону -v для grep действительно полезна для этого:

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

Это покажет вам все строки, не содержащие UFW BLOCK. Поскольку grep использует стандартные регулярные выражения по умолчанию, включение скобок приведет к поиску любого из отдельных символов «UFW BLOCK», включая пробел. Вероятно, вы не получите выход. Если вам нужно убедиться, что вокруг строки есть скобки, либо сбегите их \[UFW BLOCK\], либо используйте опцию -F в grep, чтобы включать только фиксированные строки (спасибо Zanna и Steeldriver за советы по этому поводу): [ ! d1] 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
13
ответ дан 24 July 2018 в 19:22

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

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

Мы убегаем [], как обычно, обозначают класс символов, что означает «что-то внутри»

5
ответ дан 22 May 2018 в 20:06

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

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
awk
awk '!/\[UFW BLOCK\]/' file
5
ответ дан 22 May 2018 в 20:06

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

awk '!/PATTERN/' log

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

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

, который синтаксис:

awk '!/PATTERN/ && !/PATTERN2/' log
2
ответ дан 22 May 2018 в 20:06
  • 1
    «Я использую его, когда у меня есть больше, чем один» шаблон ». и я не хочу использовать два grep like " ------ grep -Ev "foo|bar"? – αғsнιη 27 July 2017 в 16:32
  • 2
    Вы также можете использовать -e для определения нескольких шаблонов. [F2] – Arronical 27 July 2017 в 16:40
  • 3
    @AFSHIN (не знаю, как мой комментарий удаляется), я имел в виду логическое, а не или;) – Ravexina 27 July 2017 в 18:13

С помощью опции less команды less можно отфильтровать, чтобы отобразить только желаемый согласованный шаблон, как показано ниже,

& /PATTERN/

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

&! /UFW BLOCK/
1
ответ дан 22 May 2018 в 20:06

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

awk '!/PATTERN/' log

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

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

, который синтаксис:

awk '!/PATTERN/ && !/PATTERN2/' log
2
ответ дан 18 July 2018 в 09:33

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

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 awk awk '!/\[UFW BLOCK\]/' file
5
ответ дан 18 July 2018 в 09:33

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

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

Мы убегаем [], как обычно, обозначают класс символов, что означает «что-то внутри»

5
ответ дан 18 July 2018 в 09:33

С помощью опции less команды less можно отфильтровать, чтобы отобразить только желаемый согласованный шаблон, как показано ниже,

& /PATTERN/

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

&! /UFW BLOCK/
1
ответ дан 18 July 2018 в 09:33

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

awk '!/PATTERN/' log

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

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

, который синтаксис:

awk '!/PATTERN/ && !/PATTERN2/' log
2
ответ дан 24 July 2018 в 19:22
  • 1
    «Я использую его, когда у меня есть больше, чем один» шаблон ». и я не хочу использовать два grep like & quot; ------ grep -Ev "foo|bar"? – αғsнιη 27 July 2017 в 16:32
  • 2
    Вы также можете использовать -e для определения нескольких шаблонов. [F2] – Arronical 27 July 2017 в 16:40
  • 3
    @AFSHIN (не знаю, как мой комментарий удаляется), я имел в виду логическое, а не или;) – Ravexina 27 July 2017 в 18:13

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

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 awk awk '!/\[UFW BLOCK\]/' file
5
ответ дан 24 July 2018 в 19:22

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

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

Мы убегаем [], как обычно, обозначают класс символов, что означает «что-то внутри»

5
ответ дан 24 July 2018 в 19:22

С помощью опции less команды less можно отфильтровать, чтобы отобразить только желаемый согласованный шаблон, как показано ниже,

& /PATTERN/

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

&! /UFW BLOCK/
1
ответ дан 24 July 2018 в 19:22

Другие вопросы по тегам:

Похожие вопросы: