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?


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

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


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


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

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
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.