2009-09-29 23 views
12

Czy jest sposób, aby Grep użył przełącznika -v, aby zignorować linię i następną liczbę linii za nią. Jego zasadniczo do filtrowania wyjątki z pliku dziennika tjGrep ignoruje wiele linii.

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

grep go produkować:

Valid log entry 1 
Valid log entry 2 

Próbowałem grep -v Exception -A 2

ale to nie działa.

Wszelkie pomysły będą mile widziane.

+0

-v nie odwraca -A, tylko mecz – dave

+1

Z tym uproszczonym przykładem, wydaje się łatwiejsze grep dla tego, co chcesz, zamiast eliminowania tego, czego nie chcesz: "grep Valid" –

Odpowiedz

11

Spróbuj awk:

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

W twoim przypadku można powiedzieć grep również ignorować wszystkie wiersze, które zawierają prowadzącą spacje:

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

wszelkie odniesienia do dokumentów to? ciężko jest znaleźć symbole Google – useless

0

Poprawa na Glenn Jackmana, za potokiem niektóre polecenia można uzyskać przed/po behaivour:

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