Wie kann ich grep verwenden, um Zeilen OHNE zwei bestimmte Zeichenfolgen anzuzeigen?

8

Wie kann ich bei einer großen Protokolldatei diese Zeilen ohne "Erfolg" anzeigen oder nicht mit "OK" beenden?

Lee
quelle
7
grep -Ev '(success|ok$)'
Jordanm
@ Jordanm würde das gleiche vorschlagen. Dies ist jedoch eine Antwort und sollte in den richtigen Abschnitt gestellt werden.
Valentin Bajrami
@ Jordanm grandios, bitte machen Sie es eine Antwort
Lee

Antworten:

15

So entfernen Sie Zeilen, die eine der beiden Zeichenfolgen enthalten , insbesondere mit grep:

  • In einem Befehl laut Jordanms Kommentar:

    grep -Ev 'success|ok$'
    

    oder:

    grep -ve success -e 'ok$'
    

    oder:

    grep -v 'success
    ok$'
    
  • In zwei Befehlen:

    grep -v success file | grep -v 'ok$'

Beispiel:

$ cat file
success something else
success ok
just something else

$ grep -Ev 'success|ok$'
just something else
$ grep -v success file | grep -v 'ok$'
just something else

So entfernen Sie Zeilen, die beide Zeichenfolgen enthalten , insbesondere mit grep:

grep -v 'success.*ok$' file

Beispiel:

$ cat file
success something else
success ok
just something else

$ grep -v 'success.*ok$' file
success something else
just something else
Jeff Schaller
quelle
Wenn Jordanm stattdessen antworten möchte, werde ich diesen löschen.
Jeff Schaller
Nein, das ist in Ordnung.
Jordanm
1
Lee, ich sehe, dass Sie diese Antwort akzeptiert haben, aber ich möchte klarstellen, dass diese Greps Zeilen entfernen, die eine dieser beiden Zeichenfolgen enthalten. Wollten Sie nur Zeilen entfernen, die sowohl "Erfolg" enthalten als auch mit "OK" enden?
Jeff Schaller
Nein, auch nicht beide.
Lee
Danke fürs klarstellen; Sehen Sie sich die letzte Bearbeitung Ihrer Frage an, um sicherzustellen, dass darin angegeben ist, was Sie gemeint haben.
Jeff Schaller
2

Ich würde awk versuchen

awk '/success/ { next ; } /ok$/ { next ; } { print ;}' file

wo

  • /success/ { next ; }Wort finden successund Zeile überspringen
  • /ok$/ { next ; }Kleinbuchstaben finden okund Zeile überspringen
  • { print ;} implizit sonst: Zeile drucken

gemäß Vorschlag

kurz awk (danke an Stéphane Chazelas)

awk '!/success/ && !/ok$/'

Das ist im Grunde nicht (Erfolg) und nicht (ok am Ende der Zeile)

Golf awk (danke an cas)

awk '! /success|ok$/'

die regexp wiederverwenden und negieren

Archemar
quelle
Auch wenn dies funktioniert, ist das keine Antwort auf die Frage.
Quora Feans
1
Ja, es ist ein alternativer Weg.
Lee
@ Lee: Es ist keine Alternative. Es erfüllt nicht die Bedingung "grep to verwenden".
Quora Feans
4
awk '!/success/ && !/ok$/'wäre kanonischer.
Stéphane Chazelas
1
oder sogarawk '! /success|ok$/'
cas
0

Hinzufügen zu den obigen grep -Ev-Befehlen: Sie können verwenden egrep -v 'success|ok$' filename

Obi Wan Kenobi
quelle
1
egrepwird zugunsten vongrep -E
Dani_l
0

Da awk erwähnt wurde, wäre eine andere Alternative sed:

sed '/success/d;/ok$/d' file
sed -e '/success/d' -e '/ok$/d' file

oder (neuere sed und zukünftige POSIX) dank Stéphane Chazelas

sed -E '/success|ok$/d' file
Dani_l
quelle
1
Wenn Sie ändern sed -rzu sed -E, dann das funktionieren wird in einiger BSD sedzusätzlich zu (nicht zu alten Versionen von) GNU sed. sed -Ewird in der nächsten Hauptausgabe der POSIX-Spezifikation erscheinen.
Stéphane Chazelas