греп всередині менше?


58

Наразі я просіюю безліч незнайомих журналів, шукаючи деякі проблеми. Перший файл, який я переглядаю, - це Event.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.

Відповіді:


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
forquare

1
Я зрозумів це. Домоткані дупи мають останню версію. Мені просто довелося бити баш, тому що він не захопив потрібний файл (хоча він мені сказав, що хапає / користувач / локальний / бін / менше).
спінлок

7

Спираючись на відповідь Оріона , описується less(1)сторінка man

/pattern

    Шукайте вперед у файлі N -го рядка, що містить pattern.  N за замовчуванням до 1. Це patternрегулярний вираз, як розпізнається бібліотекою регулярних виразів, наданою вашою системою. Пошук починається на другому рядку відображається (але побачити -aі -jопції, які змінюють це).

    Деякі символи є спеціальними, якщо вони введені на початку pattern; вони змінюють тип пошуку, а не стають частиною pattern:

    ^N або !

      Шукайте рядки, які НЕ відповідають pattern.
    ^E або *
      Пошук у кількох файлах. Тобто, якщо пошук досягне кінця поточного файлу без пошуку відповідності, пошук продовжується в наступному файлі у списку командних рядків.
    ^F або @
      Почніть пошук у першому рядку ПЕРШОГО файлу у списку командних рядків, незалежно від того, що наразі відображається на екрані, чи параметрів параметрів -aабо -j.
    ^K
      Виділіть будь-який текст, який відповідає patternна поточному екрані, але не переходите до першого збігу (поточне положення KEEP).
    ^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або будь-яке інше слово небезпеки, не відображатимуться.


2

Протягом останніх кількох місяців я трохи захоплювався fzf.

У вашому випадку, доки контекст не потрібен (тобто еквівалент grep's -A, -Bабо -Cне потрібен, і, до речі, менші &також мають однакові обмеження), тоді fzf є дуже потужним інструментом.

Ось дурний приклад:

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

Якщо ви запускаєте це і граєте з такими входами тощо aa | bb dd | ee !gg !hh, ви швидко побачите, що відбувається.

Документація Fzf про |оператора є мізерною , але я найкраще здогадуюсь, що це стосується лише тих термінів, які знаходяться безпосередньо перед і після, а це означає, що АБО має перевагу над AND (що неявно ; всі терміни за замовчуванням є AND-ed) . Але в більшості випадків це не повинно бути проблемою, і на моєму досвіді все виходить нормально.

Дай постріл. Я вважаю це напрочуд корисним, коли мова йде про перегляд речей, коли я не дуже впевнений, що шукаю, і коли контекст не має значення.

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