grep w środku mniej?

58

Obecnie przeglądam wiele nieznanych dzienników, szukając pewnych problemów. Pierwszy plik, na który patrzę, to Events.log i otrzymuję co najmniej trzy strony, na lessktórych wydaje się wyświetlać to samo zdarzenie w różnym czasie - zdarzenie, które wydaje się być dość łagodne. Chciałbym odfiltrować to wydarzenie i obecnie rezygnuję lessi robię coś takiego

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

To przynosi teraz wiele innych, nieciekawych wydarzeń, które chciałbym również odfiltrować. Czy istnieje sposób mogę grep -v wewnątrz od less? Zamiast robić

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

Uderza mnie jako przydatna funkcja, gdy patrzę na dowolny plik dziennika - a jeśli lessnie jest to narzędzie, czy jest coś o cechach, których szukam? Po prostu lessprzeglądarka w stylu z wbudowanym grep.

forquare
źródło

Odpowiedzi:

91

lessma bardzo silne dopasowanie wzorca. Od strony man :

&pattern

    Wyświetlaj tylko te wiersze, które pasują do pattern; linie, które nie pasują do pattern nie są wyświetlane. Jeśli patternjest pusty (jeśli wpiszesz &bezpośrednio po nim ENTER), wszelkie filtrowanie jest wyłączone i wyświetlane są wszystkie wiersze. Podczas filtrowania na początku pytania wyświetlany jest znak ampersand, przypominający, że niektóre wiersze w pliku mogą być ukryte.

    Niektóre znaki są wyjątkowe, jak w /poleceniu :

    ^N lub !

      Wyświetlaj tylko wiersze, które NIE pasują do pattern.
    ^R
      Nie interpretuj metaznaków wyrażeń regularnych; to znaczy, wykonaj proste porównanie tekstowe.

    ____________
    Niektóre znaki są specjalne, jeśli zostaną wprowadzone na początku pattern; modyfikują typ wyszukiwania, a nie stają się częścią pattern.

   (Oczywiście ^Ni odpowiednio ^Rreprezentują Ctrl+ N i Ctrl+ R). 

Na przykład &dnswyświetla tylko linie pasujące do wzoru dnsi &!dnsodfiltrowuje (wyklucza) te linie, wyświetlając tylko linie, które nie pasują do wzorca.

W opisie /polecenia zaznaczono, że

    Jest patternto wyrażenie regularne rozpoznawane przez bibliotekę wyrażeń regularnych dostarczoną przez twój system.

Więc

  • &eth[01]  wyświetli linie zawierające eth0lubeth1
  • &arp.*eth0wyświetli wiersze zawierające arpnastępujące poeth0
  • &arp|dns  wyświetli linie zawierające arplubdns

I !może odwrócić dowolne z powyższych. Polecenie, którego chciałbyś użyć na przykład w swoim pytaniu, to:

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

Użyj także i do wyszukiwania (i /, aby przejść do następnego / poprzedniego)./pattern?patternnN

orion
źródło
1
To już prawie koniec! W less, użycie „&! <1stpattern>” pozwala mi „ukryć” linie z włączonym wzorem, jednak dotyczy to tylko jednego wzoru na raz, więc jeśli znajdę drugi wzór i zastosuję „&! <2ndpattern>”, linie pasujące do pierwszego wzoru i ukryte, są teraz widoczne. Tak bardzo blisko!
forquare
@forquare: Istnieje historia poleceń, do której można uzyskać dostęp za pomocą klawiszy strzałek w górę i w dół. Więc naciśnij, &!a następnie naciśnij klawisz strzałki.
PM 2,
@forquare: Właśnie odkryłem, że historia została zapisana, więc twoje stare wzory będą dostępne przy następnym uruchomieniu less; Nie wiem jednak, czy zostało zachowane po ponownym uruchomieniu.
PM 2,
1
@orion to był ostatni kawałek, za którym tęskniłem - jak połączyć ze sobą wzorce. Myślałem, że wcześniej wypróbowałem symbol rury i nie udało się, ale teraz próbuję ponownie, działa! Więc: &! <pattern1> | <pattern2> | <pattern3> usunie linie ze wzorem 1 lub wzorem 2 lub wzorem 3
forquare
1
Rozgryzłem to. Duplikaty Homebrew ma najnowszą wersję. Musiałem po prostu skopać bash, ponieważ nie pobierał właściwego pliku (mimo że powiedział mi, że pobiera / user / local / bin / less).
spinlock
7

Opierając się na odpowiedzi Oriona , less(1)strona podręcznika opisuje

/pattern

    Wyszukaj do przodu w pliku N- ty wiersz zawierający pattern.  N domyślnie patternwynosi 1. Jest to wyrażenie regularne, rozpoznawane przez bibliotekę wyrażeń regularnych dostarczoną przez twój system. Wyszukiwanie rozpoczyna się w drugim wyświetlonym wierszu (ale zobacz opcje -ai -j, które to zmieniają).

    Niektóre znaki są wyjątkowe, jeśli zostaną wprowadzone na początku pattern; modyfikują typ wyszukiwania, a nie stają się częścią pattern:

    ^N lub !

      Wyszukaj linie, które NIE pasują do pattern.
    ^E lub *
      Wyszukaj wiele plików. Oznacza to, że jeśli wyszukiwanie osiągnie KONIEC bieżącego pliku bez znalezienia dopasowania, wyszukiwanie będzie kontynuowane w następnym pliku na liście wiersza poleceń.
    ^F lub @
      Rozpocznij wyszukiwanie w pierwszym wierszu pliku FIRST na liście wiersza poleceń, bez względu na to, co jest aktualnie wyświetlane na ekranie lub ustawienia -alub -j.
    ^K
      Zaznacz dowolny tekst, który pasuje do patternbieżącego ekranu, ale nie przechodź do pierwszego dopasowania (ZACHOWAJ bieżącą pozycję).
    ^R
      Nie interpretuj metaznaków wyrażeń regularnych; to znaczy, wykonaj proste porównanie tekstowe.

    ____________
    Polecenia mogą być poprzedzone liczbą dziesiętną, zwaną N w opisach…

   (Oczywiście ^Ni ^Eitp. Reprezentują Ctrl+ Ni Ctrl+ Eitp.) 

Okazuje się, że i działają dobrze razem. Na przykład polecenia&pattern/pattern

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

wpisany w dowolnej kolejności, ukryje (wykluczenie) wszystkie linie zawierające arplub dns(jak grep -v), a następnie w pozostałych liniach wyróżnić wszystkie wystąpienia fail, fatal, fault, lub coś, co wygląda jak nazwa urządzenia SCSI ( sd[a-z][0-9]). Należy pamiętać, że wiersze zawierające arplub dns, a także faildowolne inne niebezpieczne słowa, nie będą wyświetlane.

G-Man
źródło
2

W ciągu ostatnich kilku miesięcy trochę się zakochałem fzf.

W przypadku, o ile kontekst nie jest potrzebne (czyli równowartość grepa -A, -Bczy -Cnie jest potrzebna, a przy okazji, mniej na &ma również takie same ograniczenia), następnie fzf jest bardzo potężnym narzędziem.

Oto głupi przykład:

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

Jeśli to uruchomisz i będziesz grać z wejściami takimi jak aa | bb dd | ee !gg !hhi tak dalej, szybko zobaczysz, co się dzieje.

Dokumentacja Fzf na temat |operatora jest niewielka, ale przypuszczam, że dotyczy ona tylko warunków bezpośrednio przed i po, co oznacza w efekcie, że OR ma pierwszeństwo przed AND ( domyślnie ; wszystkie warunki są domyślnie AND) . Ale w większości przypadków nie powinno to stanowić problemu i z mojego doświadczenia wynika, że ​​wszystko działa dobrze.

Spróbuj. Uznałem, że jest to zaskakująco przydatne, jeśli chodzi o przeglądanie rzeczy, gdy tak naprawdę nie jestem pewien, czego szukam i kiedy kontekst nie ma znaczenia.

sitaram
źródło