Como executar o grep e mostrar x número de linhas antes e depois do jogo [duplicado]

5

grep retorna apenas a linha onde corresponde a regex e muitas vezes o que eu realmente quero ver são algumas (digamos, 2) linhas acima e abaixo da linha correspondente. Existe uma maneira simples de consegui-lo?

EDITAR: SO: Ubuntu baseado em Bodhi Linux. Como mencionado nos comentários, o C não funciona no baunilha, mas no GNU grep no meu caso.

    
por Anuvrat Parashar 26.02.2013 / 19:54

2 respostas

10

De man grep :

Context Line Control

-A NUM, --after-context=NUM

Print NUM lines of trailing context after matching lines. Places a line containing a group separator (--) between contiguous groups of matches. With the -o or --only-matching option, this has no effect and a warning is given.

-B NUM, --before-context=NUM

Print NUM lines of leading context before matching lines. Places a line containing a group separator (--) between contiguous groups of matches. With the -o or --only-matching option, this has no effect and a warning is given.

-C NUM, -NUM, --context=NUM

Print NUM lines of output context. Places a line containing a group separator (--) between contiguous groups of matches. With the -o or --only-matching option, this has no effect and a warning is given.

Veja como foi fácil? man é seu amigo.

    
por 26.02.2013 / 20:02
0

Usando (mais portátil):

awk '
    {
        arr[NR]=$0
    }
    END{
        for (i=0;i<=NR;i++) {
            if (arr[i] ~ grep){
                for (j=i-count; j<=i+count; j++) {
                    print arr[j]
                }
            }
        }
    }
' grep=kdm count=4 /etc/passwd

Eu faço o grep user kdm againts /etc/passwd com 4 linhas antes / depois da correspondência

Em um script :

#!/bin/sh

awk '
    {
        arr[NR]=$0
    }
    END{
        for (i=0;i<=NR;i++) {
            if (arr[i] ~ grep){
                for (j=i-count; j<=i+count; j++) {
                    print arr[j]
                }
            }
        }
    }
' grep="$1" count="$2" "$3"

Uso:

./contextgrep <pattern> <count> <file> 
    
por 26.02.2013 / 21:35

Tags