2009-09-29 21 views
12

¿Hay alguna manera con Grep de utilizar el modificador -v para ignorar una línea y el siguiente número de líneas después de ella. Su básicamente para filtrar excepciones desde un archivo de registro, es decirGrep ignora líneas múltiples

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

grep que produzca:

Valid log entry 1 
Valid log entry 2 

He tratado grep -v Exception -A 2

pero esto no funciona.

Cualquier idea sería apreciada.

+0

El -v no invierte el -A, solo la coincidencia – dave

+1

Con este ejemplo simplista, parece más fácil obtener lo que usted quiere en lugar de eliminar lo que no desea: 'grep Válido' –

Respuesta

11

Try awk:

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

En su caso, usted puede decirle a grep también caso omiso de las líneas que contienen espacios iniciales:

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

referencia de cualquier documento ¿esta? es difícil googlear símbolos – useless

0

La mejora sobre Glenn Jackman, mediante la canalización de algunos comandos que puede obtener antes/después de 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 
Cuestiones relacionadas