Anzeigen von Dateien ohne Zeilen mit einer bestimmten Zeichenfolge

12

Suchen nach einem Programm wie tailoder, mit lessdem ich meine Protokolle ohne Zeilen mit einer bestimmten Zeichenfolge anzeigen kann. Zum Beispiel mein Syslog ohne UFW ( [UFW BLOCK]) -Eingabezeilen anzeigen .

John Gr.
quelle
Mit dieser Funktion ist es zwar nicht einfach, eine Lösung für Ihre genaue Problembeschreibung zu finden, Sie könnten jedoch interessiert sein, dass sie lessdie Möglichkeit bietet, die angezeigten Linien nach einem regulären Ausdruck zu filtern. Sie können diese Funktion verwenden, indem Sie &gefolgt von dem Muster eingeben , und Sie können sie durch &alleiniges Eingeben wiederherstellen.
Aaron

Antworten:

13

Die Pattern Match Inversion Option -vfür grepist dabei sehr hilfreich:

grep -v 'UFW BLOCK' /var/log/syslog

Dies zeigt Ihnen alle Zeilen, die nichts enthalten UFW BLOCK. Da grepAnwendungen grundlegende reguläre Ausdrücke standardmäßig die Aufnahme der Klammern wird es für jede der einzelnen Zeichen von ‚UFW BLOCK‘ einschließlich der Raum machen suchen. Sie werden wahrscheinlich ohne Ausgabe enden. Wenn Sie sicherstellen möchten , dass sich um die Zeichenfolge herum Klammern befinden, schließen Sie diese entweder \[UFW BLOCK\]oder verwenden Sie die -FOption grep, nur feste Zeichenfolgen einzuschließen (Vielen Dank an Zanna und Steeldriver für die entsprechenden Hinweise):

grep -Fv '[UFW BLOCK]' /var/log/syslog

Sie können die Anzeige vereinfachen, indem Sie die Ausgabe an einen Pager wie folgt weiterleiten less:

grep -v 'UFW BLOCK' /var/log/syslog | less

Oder leiten Sie die Ausgabe zur späteren Anzeige in eine Datei in Ihrem Ausgangsverzeichnis um:

grep -v 'UFW BLOCK' /var/log/syslog > ~/filtered_syslog
Arronisch
quelle
2
Sie können auch den fgrepBefehl verwenden, der äquivalent zu ist grep -F.
Tulains Córdova
2
@ TulainsCórdova Der Mann von grep sagt, dass "der direkte Aufruf als egrep oder fgrep veraltet ist, aber dafür vorgesehen ist, dass historische Anwendungen, die darauf angewiesen sind, unverändert ausgeführt werden". Ich weiß nicht, ob sie jemals gegen diese Abwertung vorgehen werden, aber ich denke, diese Befehle zu verwenden, ist keine bewährte Methode
Aaron
5

Sie können auch sedden dBefehl von verwenden, um die Zeilen mit dem Muster aus dem Stream zu löschen:

sed '/\[UFW BLOCK\]/d' /var/log/syslog

Wir fliehen []wie gewohnt, sie bezeichnen eine Charakterklasse, was bedeutet, dass "hier drinnen alles passt".

Zanna
quelle
5

Sie können jedes Werkzeug mit Bearbeitungsfunktionen verwenden. Sie haben bereits Lösungen mit grepund erhalten sed. Hier sind einige andere Optionen. Alle diese Faktoren können leicht geleitet werden lessoder moresonst oder sonst etwas.

  1. Perl

    perl -ne 'print unless /\[UFW BLOCK\]/' /var/log/syslog
    

    Da dies Perl ist, ist TIMTOWDI! .

    perl -pe '$_="" if /\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ || print' /var/log/syslog
    perl -ne 'print if !/\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '!/\[UFW BLOCK\]/ && print' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ ? "" : print' /var/log/syslog
    
  2. awk

    awk '!/\[UFW BLOCK\]/' file
    
terdon
quelle
2

Sie können auch verwenden awk:

awk '!/PATTERN/' log

Ich benutze es, wenn ich mehr als ein "Muster" habe und nicht zwei verwenden möchte, grepwie:

... | grep -v foo | grep -v bar

welche die syntax ist:

awk '!/PATTERN/ && !/PATTERN2/' log
Ravexina
quelle
"Ich benutze es, wenn ich mehr als ein" Muster "habe und nicht zwei grep wie" ------ grep -Ev "foo|bar"?
αғsнιη
Sie können auch -emehrere Muster definieren. grep -v -e 'foo' -e 'bar'
Arronical
@AFSHIN (Ich weiß nicht, wie mein Kommentar entfernt wird), ich meinte für eine logische und nicht oder;)
Ravexina
1

Mit lessder &Option des Befehls ist es möglich herauszufiltern, um nur das gewünschte übereinstimmende Muster wie folgt anzuzeigen.

& /PATTERN/

Wenn in Ihrem Fall Filterzeilen mit UFW BLOCKnicht in der Ausgabe angezeigt werden sollen, können Sie einfach &!Folgendes verwenden:

&! /UFW BLOCK/
αғsнιη
quelle