греп внутри меньше?

58

В настоящее время я просматриваю множество незнакомых журналов в поисках некоторых проблем. Первый файл, на который я смотрю, это Events.log, и я получаю как минимум три страницы, на lessкоторых, по-видимому, отображается одно и то же событие в разное время - событие, которое выглядит довольно мягким. Я хотел бы отфильтровать это событие, и в настоящее время я ухожу lessи делаю что-то вроде

grep -v "event text" Events.log | less

Это теперь приносит ряд других общих, неинтересных событий, которые я также хотел бы отфильтровать. Есть ли способ , я могу grep -v внутри из less? Вместо того, чтобы делать

egrep -v "event text|something else|the other thing|foo|bar" Events.log | less

Мне кажется, что это полезная функция при просмотре любого файла журнала - и если lessэто не инструмент, есть ли другой, обладающий теми качествами, которые я ищу? Просто lessпросмотрщик в стиле со встроенным grep.

forquare
источник

Ответы:

91

lessимеет очень мощное сопоставление с образцом. Со страницы руководства :

&pattern

    Отображать только те строки, которые соответствуют pattern; строки, которые не соответствуют pattern , не отображаются. Если patternпусто (если вы печатаете &сразу, а затем ENTER), любая фильтрация отключается, и отображаются все строки. Пока действует фильтрация, в начале запроса отображается амперсанд в качестве напоминания о том, что некоторые строки в файле могут быть скрыты.

    Некоторые символы являются специальными, как в /команде :

    ^N или же !

      Отображать только те строки, которые НЕ соответствуют pattern.
    ^R
      Не интерпретируйте метасимволы регулярных выражений; то есть сделать простое текстовое сравнение.

    ____________
    Некоторые символы являются специальными, если они введены в начале pattern; они изменяют тип поиска, а не становятся частью pattern.

   (Конечно ^Nи ^Rобозначают Ctrl+ N и Ctrl+ Rсоответственно.) 

Так, например, &dnsбудут отображаться только строки, которые соответствуют шаблону dns, и &!dnsбудет отфильтровываться (исключать) эти строки, отображая только строки, которые не соответствуют шаблону.

В описании команды указано, /что

    Это patternрегулярное выражение, распознаваемое библиотекой регулярных выражений, предоставляемой вашей системой.

Так

  • &eth[01]  отобразит строки, содержащие eth0илиeth1
  • &arp.*eth0будет отображать строки, содержащие arpпослеeth0
  • &arp|dns  отобразит строки, содержащие arpилиdns

И !может инвертировать любой из вышеперечисленных. Итак, команда, которую вы хотели бы использовать для примера в вашем вопросе:

&!event text|something else|the other thing|foo|bar

Также используйте и для поиска (и /, чтобы перейти к следующему / предыдущему)./pattern?patternnN

Орион
источник
1
Это почти там! В less, используя «&! <1stpattern>» позволяет мне «скрыть» линии с рисунком на, однако это относится только к одной модели , в то время, так что если я найду второй шаблон и применить «&! <2ndpattern>», линии, которые соответствовали первому шаблону и были скрыты, теперь видны. Так очень близко!
forquare
@forquare: есть история команд, доступ к которой можно получить с помощью клавиш со стрелками вверх и вниз. Поэтому нажмите, &!а затем нажмите клавишу со стрелкой.
PM 2Ring
@forquare: я только что обнаружил, что история сохраняется, поэтому ваши старые шаблоны будут доступны при следующем запуске less; Я не знаю, сохранился ли он после перезагрузки, хотя.
PM 2Ring
1
@orion, это был последний бит, который мне не хватало - как объединять шаблоны вместе. Хотя раньше я пробовал символ трубы, но он не удался, но теперь я пробую снова, он работает! Итак: &! <Pattern1> | <pattern2> | <pattern3> удалит строки с pattern1 или pattern2 или pattern3
квадрат
1
Я понял. Homebrew dupes имеет последнюю версию. Мне просто нужно было пнуть bash, потому что он не захватывал нужный файл (хотя это и говорило, что он захватывал / user / local / bin / less).
спинлок
7

Основываясь на ответе Ориона , less(1)страница руководства описывает

/pattern

    Поиск вперед в файле для N-й строки, содержащей pattern.  N † по умолчанию 1. patternРегулярное выражение, распознаваемое библиотекой регулярных выражений, предоставляемой вашей системой. Поиск начинается со второй отображаемой строки (но смотрите параметры -aи -j, которые меняют это).

    Некоторые символы являются специальными, если они введены в начале pattern; они изменяют тип поиска, а не становятся частью pattern:

    ^N или же !

      Поиск строк, которые НЕ соответствуют pattern.
    ^E или же *
      Поиск нескольких файлов. То есть, если поиск достигает КОНЦА текущего файла без поиска соответствия, поиск продолжается в следующем файле в списке командной строки.
    ^F или же @
      Начните поиск с первой строки файла FIRST в списке командной строки, независимо от того, что в данный момент отображается на экране, или от параметров -aили -j.
    ^K
      Выделите любой текст, который соответствует patternна текущем экране, но не переходите к первому совпадению (СОХРАНИТЕ текущую позицию).
    ^R
      Не интерпретируйте метасимволы регулярных выражений; то есть сделать простое текстовое сравнение.

    ____________
    Командам может предшествовать десятичное число, которое в описании называется N

   (Конечно ^Nи и ^Eт. Д., Представляют Ctrl+ Nи Ctrl+ Eи т. Д.) 

Оказывается, и хорошо работают вместе. Например, команды&pattern/pattern

  • &!arp|dnsEnter
  • /Ctrl+Kfail|fatal|fault|sd[a-z][0-9]Enter

набраны в любом порядке, будет скрывать (исключить) все строки , содержащие arpили dns(как grep -v), а затем, в остальных строках, выделить все вхождения fail, fatal, faultили что - то , что выглядит как имя устройства SCSI ( sd[a-z][0-9]). Обратите внимание, что строки, содержащие arpили dns, а также failили любые другие опасные слова, отображаться не будут.

G-Man говорит: «Восстанови Монику»
источник
2

За последние несколько месяцев я стал несколько очарован fzf.

В вашем случае, пока контекст не нужен (т.е. эквивалент Grep - х -A, -Bили -Cне нужно, и, кстати, меньше , это &также имеет то же ограничение), то fzf является очень мощным инструментом.

Вот глупый пример:

printf "%s\n" {aa,bb,cc}{dd,ee,ff}{gg,hh,ii} | fzf

Если вы запустите это и поиграете с такими входными данными, как aa | bb dd | ee !gg !hhи так далее, вы быстро увидите, что происходит.

Документация Fzf об |операторе очень скудна, но я думаю, что она применима только к терминам непосредственно до и после, что означает, что фактически OR имеет приоритет над AND (что подразумевается ; все термины по умолчанию имеют AND) , Но в большинстве случаев это не должно быть проблемой, и, по моему опыту, все идет хорошо.

Дать ему шанс. Я нашел это удивительно полезным, когда дело доходит до просмотра вещей, когда я не совсем уверен, что я ищу, и когда контекст не имеет значения.

Ситарам
источник