Grep innen weniger?


58

Momentan durchsuche ich viele unbekannte Protokolle, um nach Problemen zu suchen. Die erste Datei, die ich mir ansehe, ist Events.log. Auf mindestens drei Seiten lesswird das gleiche Ereignis zu unterschiedlichen Zeiten angezeigt - ein Ereignis, das ziemlich harmlos zu sein scheint. Ich möchte dieses Ereignis herausfiltern, und derzeit beende ich lessund mache so etwas

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

Dies bringt nun eine Reihe weiterer häufiger, uninteressanter Ereignisse mit sich, die ich ebenfalls herausfiltern möchte. Gibt es einen Weg, den ich grep -v innerhalb von kann less? Anstatt es tun zu müssen

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

Es scheint mir eine nützliche Funktion zu sein, wenn ich mir eine Protokolldatei anschaue - und wenn lessdas Tool nicht vorhanden ist, gibt es eine andere mit den Eigenschaften, die ich suche? Nur ein lessViewer mit eingebautem grep.

Antworten:


91

lesshat sehr leistungsstarke Mustererkennung. Von der Manpage :

&pattern

    Nur Zeilen anzeigen, die mit dem pattern; Zeilen, die nicht mit den übereinstimmen, pattern werden nicht angezeigt. Wenn patternleer ist (wenn Sie &unmittelbar danach tippen ENTER), wird die Filterung deaktiviert und alle Zeilen werden angezeigt. Während der Filterung wird am Anfang der Eingabeaufforderung ein kaufmännisches Und angezeigt, um Sie daran zu erinnern, dass einige Zeilen in der Datei möglicherweise ausgeblendet sind.

    Bestimmte Zeichen sind speziell wie im /Befehl :

    ^N oder !

      Nur Zeilen anzeigen, die NICHT mit dem übereinstimmen pattern.
    ^R
      Interpretieren Sie keine Metazeichen mit regulären Ausdrücken. Führen Sie also einen einfachen Textvergleich durch.

    ____________
    Bestimmte Zeichen sind Sonderzeichen, wenn sie am Anfang des pattern; Sie ändern die Art der Suche, anstatt Teil der Suche zu werden pattern.

   (Natürlich ^Nund ^Rrepräsentieren jeweils Ctrl+ N und Ctrl+ R.) 

So werden beispielsweise &dnsnur Linien angezeigt, die mit dem Muster übereinstimmen dns, und &!dnsdiese Linien werden herausgefiltert (ausgeschlossen), wobei nur Linien angezeigt werden, die nicht mit dem Muster übereinstimmen.

In der Beschreibung des /Befehls wird darauf hingewiesen, dass

    Dies patternist ein regulärer Ausdruck, der von der von Ihrem System bereitgestellten Bibliothek für reguläre Ausdrücke erkannt wird.

Damit

  • &eth[01]  zeigt Zeilen an, die eth0oder enthalteneth1
  • &arp.*eth0zeigt Zeilen mit arpgefolgt von aneth0
  • &arp|dns  zeigt Zeilen an, die arpoder enthaltendns

Und die !kann eines der oben genannten invertieren. Der Befehl, den Sie für das Beispiel in Ihrer Frage verwenden möchten, lautet also:

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

Verwenden Sie auch und, um zu suchen (und / , um zum nächsten / vorherigen zu gelangen)./pattern?patternnN


1
Das ist fast da! In less, mit ‚&! <1stpattern>‘ erlaubt es mir zu ‚verstecken‘ Linien mit einem Muster auf, aber es gilt nur für ein Muster zu einem Zeitpunkt, also wenn ich ein zweites Muster finden und anzuwenden ‚&! <2ndpattern>‘, Linien, die mit dem ersten Muster übereinstimmen und ausgeblendet wurden, sind jetzt sichtbar. Also ganz nah dran!
Forquare

@forquare: Es gibt einen Befehlsverlauf, auf den Sie mit den Aufwärts- und Abwärtspfeiltasten zugreifen können. Drücken Sie also &!und dann eine Pfeiltaste.
PM 2Ring

@forquare: Und ich habe gerade festgestellt, dass der Verlauf gespeichert ist, sodass Ihre alten Muster beim nächsten Start verfügbar sind less. Ich weiß jedoch nicht, ob es nach dem Neustart erhalten bleibt.
PM 2Ring

1
@orion, das war das letzte bisschen, das mir gefehlt hat - wie man Muster miteinander verkettet. Ich dachte, ich hätte das Pipe-Symbol schon einmal ausprobiert und es ist fehlgeschlagen, aber jetzt versuche ich es noch einmal, es funktioniert! Also: &! <Pattern1> | <pattern2> | <pattern3> entfernt Linien mit pattern1 oder pattern2 oder pattern3
forquare am

1
Ich habe es herausgefunden. Homebrew Dupes hat die neueste Version. Ich musste nur bash kicken, weil es nicht die richtige Datei packte (obwohl mir das sagte, dass es / user / local / bin / less war).
Spinlock

7

Aufbauend auf der Antwort von orion beschreibt die less(1)Manpage

/pattern

    Suchen Sie in der Datei nach der N- ten Zeile mit dem pattern.  Der  Standardwert für N † ist 1. Dies patternist ein regulärer Ausdruck, der von der von Ihrem System bereitgestellten Bibliothek für reguläre Ausdrücke erkannt wird. Die Suche beginnt in der zweiten angezeigten Zeile (sehen Sie jedoch die Optionen -aund -j, die dies ändern).

    Bestimmte Zeichen sind Sonderzeichen, wenn sie am Anfang des pattern; Sie ändern die Art der Suche und werden nicht Teil der pattern:

    ^N oder !

      Suchen Sie nach Zeilen, die NICHT mit dem übereinstimmen pattern.
    ^E oder *
      Suche nach mehreren Dateien. Das heißt, wenn die Suche das ENDE der aktuellen Datei erreicht, ohne eine Übereinstimmung zu finden, wird die Suche in der nächsten Datei in der Befehlszeilenliste fortgesetzt.
    ^F oder @
      Beginnen Sie die Suche in der ersten Zeile der ERSTEN Datei in der Befehlszeilenliste, unabhängig davon, was aktuell auf dem Bildschirm angezeigt wird oder welche Einstellungen für die Optionen -aoder vorgenommen wurden -j.
    ^K
      Markieren Sie einen Text, der mit dem patternauf dem aktuellen Bildschirm übereinstimmt , gehen Sie jedoch nicht zur ersten Übereinstimmung über (BEHALTEN Sie die aktuelle Position).
    ^R
      Interpretieren Sie keine Metazeichen mit regulären Ausdrücken. Führen Sie also einen einfachen Textvergleich durch.

    ____________
    Vor Befehlen kann eine Dezimalzahl stehen, die in den Beschreibungen mit N bezeichnet ist.

   (Natürlich ^Nund ^Eusw. stehen für Ctrl+ Nund Ctrl+ Eusw.) 

Es stellt sich heraus, dass und gut zusammenarbeiten. Zum Beispiel die Befehle&pattern/pattern

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

in beliebiger Reihenfolge eingegeben, versteckt (schließen) alle Zeilen enthalten arpoder dns(wie grep -v), und dann, in den übrigen Linien, markieren Sie alle Vorkommen fail, fatal, fault, oder etwas , das wie der Name eines SCSI - Geräts sieht ( sd[a-z][0-9]). Beachten Sie, dass Zeilen, die arpoder dnsund auch failoder eines der anderen Gefahrenwörter enthalten, nicht angezeigt werden.


2

In den letzten Monaten habe ich mich ein wenig verliebt fzf.

In Ihrem Fall, solange Kontext nicht benötigt wird (dh das äquivalent von grep -A, -Boder -Cnicht benötigt wird , und durch die Art und Weise, weniger die &hat auch die gleiche Einschränkung), dann ist fzf ein sehr mächtiges Werkzeug.

Hier ist ein dummes Beispiel:

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

Wenn Sie das ausführen und mit Eingaben wie aa | bb dd | ee !gg !hhusw. spielen, werden Sie schnell sehen, was passiert.

Die Fzf-Dokumentation zum |Operator ist spärlich, aber ich vermute, dass sie nur für die Begriffe unmittelbar vor und nach gilt. Dies bedeutet, dass ODER Vorrang vor UND hat (was implizit ist ; alle Begriffe sind standardmäßig UND-verknüpft). . Aber in den meisten Fällen sollte dies kein Problem sein, und meiner Erfahrung nach läuft es gut.

Versuch es einmal. Ich habe es überraschend nützlich gefunden, wenn es darum geht, Dinge zu durchsuchen, wenn ich nicht sicher bin, wonach ich suche und wenn der Kontext keine Rolle spielt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.