Existe uma maneira de obter o efeito de combinar grep -v com grep -A?

2

Existe uma maneira, seja com grep ou outra coisa, para (na verdade) combinar grep -v e grep -A ? Isto é, ao invés de incluir tudo para x linhas depois de uma string, excluir tudo.

Lembrete rápido para aqueles que esquecem seus switches grep:
cat file.txt | grep -v blah filtra 'blah', o oposto do grep normal
cat file.txt | grep -A7 foo exibe 7 linhas após cada ocorrência de 'foo'
(Sim, estou ciente de que cat é desnecessário aqui. Mas acho muito mais legível quando você agrupa muitas instruções grep para fazer isso dessa maneira.)

Basta dizer que cat file.txt | grep -A100 bar | grep -vA100 foo
não funciona. "Working" seria definido como exibir tudo (até 100 linhas) entre a linha correspondente à 'barra' e a linha correspondente 'foo'.

    
por iconoclast 23.07.2011 / 21:48

1 resposta

5

Existe uma maneira simples de extrair todos os fragmentos de bar para foo com sed:

sed -n '/bar/,/foo/p'

ou com o awk:

awk '/bar/, /foo/'

Se você quiser truncar as partes, é um pouco mais complicado (no awk; no sed, é muito mais complicado). Aqui está uma solução:

awk -vmax_lines_per_chunk=100 '
    /bar/ {n=max_lines_per_chunk}
    /foo/ {if (n) print; n=0}
    n {--n; print}
'
    
por 23.07.2011 / 22:40