search - values - print n lines after grep




grep um arquivo, mas mostra várias linhas circundantes? (6)

ripgrep

Se você se preocupa com o desempenho, use o ripgrep que tem uma sintaxe similar ao grep , por exemplo

rg -C5 "pattern" .

-C , --context NUM - Mostra NUM linhas antes e depois de cada partida.

Também existem parâmetros como -A / --after-context e -B / --before-context .

A ferramenta é construída sobre o motor regex da Rust, o que a torna muito efficient em dados grandes.

Eu gostaria de grep para uma seqüência de caracteres, mas também mostrar as cinco linhas anteriores e as cinco linhas seguintes, bem como a linha correspondente. Como eu poderia fazer isso?


Aqui está a solução @Ygor no awk

awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=3 a=3 s="pattern" myfile

Nota: Substitua as variáveis a e b pelo número de linhas antes e depois.

É especialmente útil para sistemas que não suportam os parâmetros -A , -B e -C do grep.


Para BSD ou GNU grep você pode usar -B num para definir quantas linhas antes da partida e -A num para o número de linhas após a partida.

grep -B 3 -A 2 foo README.txt

Se você quiser o mesmo número de linhas antes e depois, você pode usar -C num .

grep -C 3 foo README.txt

Isto mostrará 3 linhas antes e 3 linhas depois.


Procure por "17655" em "/some/file.txt" mostrando o contexto de 10 linhas antes e depois (usando Awk), saída precedida com o número da linha seguido por dois pontos. Use isso no Solaris quando o 'grep' não suportar as opções "- [ACB]".

awk '

/17655/ {
        for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) {
                print before[i]
        }
        print (NR ":" ($0))
        a = 10
}

a-- > 0 {
        print (NR ":" ($0))
}

{
        before[b] = (NR ":" ($0))
        b = (b + 1) % 10
}' /some/file.txt;

ack trabalha com argumentos semelhantes ao grep e aceita -C . Mas geralmente é melhor pesquisar por código.


-A e -B funcionarão, assim como -C n (para n linhas de contexto), ou apenas -n (para n linhas de contexto).





command-line-interface