2009-09-29 5 views
12

Existe-t-il un moyen avec Grep d'utiliser l'option -v pour ignorer une ligne et le prochain nombre de lignes après celle-ci. Son essentiellement pour filtrer des exceptions à partir d'un fichier journal à savoirGrep ignore plusieurs lignes

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

grep pour produire:

Valid log entry 1 
Valid log entry 2 

J'ai essayé grep -v Exception -A 2

mais cela ne fonctionne pas.

Toutes les idées seraient appréciées.

+0

Le -v n'invertit pas le -A, juste le match – dave

+1

Avec cet exemple simpliste, il semble plus facile de grep pour ce que vous voulez au lieu d'éliminer ce que vous ne voulez pas: 'grep Valid' –

Répondre

11

Essayez awk:

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

Dans votre cas, vous pourriez dire grep ignorer également toutes les lignes qui contiennent les espaces au:

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

tout document référençant ce? il est difficile de google symboles – useless

0

Améliorer le glenn jackman de, en redirigeant certains commandes que vous pouvez obtenir avant/après 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