search - values - print n lines after grep
grep um arquivo, mas mostra várias linhas circundantes? (6)
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?
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.
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).