2009-09-29 5 views
12

Gibt es einen Weg mit Grep, den -v-Schalter zu verwenden, um eine Zeile und die nächste Anzahl von Zeilen danach zu ignorieren. Sein im Allgemeinen Ausnahmen aus einer Protokolldatei zu filtern heißtGrep ignoriert mehrere Zeilen

Valid log entry 1 
Exception exceptionname 
    at a.b.c 
    at d.e.f 
    ... 
Valid log entry 2 

grep es zu produzieren:

Valid log entry 1 
Valid log entry 2 

ich versucht habe grep -v Exception -A 2

aber das funktioniert nicht.

Irgendwelche Ideen würden geschätzt.

+0

Das -v nicht die -A invertieren, nur die Übereinstimmung – dave

+1

Mit diesem vereinfachten Beispiel scheint es einfacher zu grep für was Sie wollen, anstatt zu beseitigen, was Sie nicht wollen: 'grep Valid' –

Antwort

11

Try awk:

awk -v nlines=2 '/^Exception/ {for (i=0; i<nlines; i++) {getline}; next} 1' 
3

In Ihrem Fall könnten Sie grep sagen auch alle Zeilen zu ignorieren, die führende Leerzeichen enthalten:

grep -v 'Exception|^\s' 
5
 
sed -n '/^Exception/,+2!p' filename 
+0

Beliebigen Dokumentverweise Dies? Es ist schwer, Symbole zu googeln – useless

0

Verbesserung auf glenn Jackman, durch einige Rohrleitungen Befehle können Sie das Vorher/Nachher-Verhalten erhalten:

awk -v nlines_after=5 '/EXCEPTION/ {for (i=0; i<nlines_after; i++) {getline};print "EXCEPTION" ;next} 1' filename.txt|\ 
tac|\ 
awk -v nlines_before=1 '/EXCEPTION/ {for (i=0; i<nlines_before; i++) {getline}; next} 1'|\ 
tac