it-swarm.com.de

grep drinnen weniger?

Ich durchsuche derzeit viele unbekannte Protokolle nach Problemen. Die erste Datei, die ich mir ansehe, ist Events.log, und ich erhalte mindestens drei Seiten in less, auf denen dasselbe Ereignis zu unterschiedlichen Zeiten angezeigt wird - ein Ereignis, das ziemlich harmlos erscheint. Ich möchte dieses Ereignis herausfiltern, und derzeit beende ich less und mache so etwas

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

Dies bringt nun eine Reihe anderer häufiger, uninteressanter Ereignisse mit sich, die ich ebenfalls herausfiltern möchte. Gibt es eine Möglichkeit, wie ich grep -vinside von less? Anstatt zu tun

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 irgendeine Art von Protokolldatei betrachte - und wenn less nicht das Werkzeug ist, gibt es eine andere mit den Eigenschaften, die ich suche? Nur ein Viewer im less-Stil mit integriertem grep.

63
forquare

less hat einen sehr leistungsstarken Mustervergleich. Aus der Manpage :

&pattern

    Nur Zeilen anzeigen, die mit pattern Übereinstimmen; Zeilen, die nicht mit pattern übereinstimmen, werden nicht angezeigt. Wenn pattern Leer ist (wenn Sie & Eingeben, gefolgt von 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 Sonderzeichen wie im Befehl /::

    ^N Oder !

      Zeigen Sie nur Zeilen an, die NICHT mit pattern Übereinstimmen.
    ^R
      Interpretieren Sie keine Metazeichen für reguläre Ausdrücke. Führen Sie einen einfachen Textvergleich durch.

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

(Natürlich repräsentieren ^N Und ^R Ctrl+N und Ctrl+R, beziehungsweise.)

So zeigt beispielsweise &dns Nur Zeilen an, die dem Muster dns entsprechen, und &!dns Filtert diese Zeilen heraus (schließt sie aus) und zeigt nur Zeilen an, die nicht übereinstimmen das Muster.

In der Beschreibung des Befehls / Wird darauf hingewiesen, dass

    Der pattern Ist ein regulärer Ausdruck, wie er von der von Ihrem System bereitgestellten Bibliothek für reguläre Ausdrücke erkannt wird.

Damit

  • &eth[01] Zeigt Zeilen an, die eth0 Oder eth1 Enthalten.
  • &arp.*eth0 Zeigt Zeilen mit arp gefolgt von eth0 An.
  • &arp|dns Zeigt Zeilen an, die arp oder dns enthalten

Und der ! Kann jeden der oben genannten Punkte 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 /pattern Und ?pattern Zum Suchen (und n/N, um zum nächsten/vorherigen zu gelangen).

101
orion

Aufbauend auf orions Antwort beschreibt die less(1) manpage

/pattern

    Suchen Sie in der Datei nach dem N.-te Zeile mit dem patternN.der Standardwert ist 1. Der pattern ist 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 (siehe jedoch die Optionen -a Und -j, Die dies ändern).

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

    ^N Oder !

      Suchen Sie nach Zeilen, die NICHT mit pattern Übereinstimmen.
    ^E Oder *
      Durchsuchen Sie mehrere 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 die Optionen -a Oder -j Haben.
    ^K
      Markieren Sie den Text, der mit pattern Auf dem aktuellen Bildschirm übereinstimmt, aber wechseln Sie nicht zur ersten Übereinstimmung (BEHALTEN Sie die aktuelle Position).
    ^R
      Interpretieren Sie keine Metazeichen für reguläre Ausdrücke. Führen Sie einen einfachen Textvergleich durch.

    ____________
    Befehlen kann eine Dezimalzahl vorangestellt werden, die aufgerufen wird N.in den Beschreibungen…

(Natürlich repräsentieren ^N Und ^E Usw. Ctrl+N und Ctrl+E, usw.)

Es stellt sich heraus, dass &pattern Und /pattern Gut zusammenarbeiten. Zum Beispiel die Befehle

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

wenn Sie in einer der beiden Reihenfolgen eingeben, werden alle Zeilen, die arp oder dns enthalten (wie grep -v), ausgeblendet (ausgeschlossen), und in den verbleibenden Zeilen werden alle Vorkommen von hervorgehoben fail, fatal, fault oder alles, was wie der Name eines SCSI-Geräts aussieht (sd[a-z][0-9]). Beachten Sie, dass Zeilen, die arp oder dns sowie fail oder eines der anderen Gefahrenwörter enthalten, not angezeigt werden.

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

In Ihrem Fall ist solange der Kontext nicht benötigt wird (dh das Äquivalent von greps -A, -B Oder -C Wird nicht benötigt, und übrigens hat weniger & 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 !hh Usw. spielen, werden Sie schnell sehen, was passiert.

Die Dokumentation von Fzf zum Operator | Ist spärlich, aber ich vermute, dass sie nur für die Begriffe unmittelbar davor und danach gilt, was bedeutet, dass OR Vorrang vor) hat AND (was implizit ist; alle Begriffe sind standardmäßig AND-ed). In den meisten Fällen sollte dies jedoch kein Problem sein, und meiner Erfahrung nach funktionieren die Dinge in Ordnung.

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

2
sitaram