grep um arquivo, mas mostrar várias linhas ao redor?
-
08-06-2019 - |
Pergunta
Eu gostaria de grep
para uma seqüência de caracteres, mas também mostrar os últimos cinco linhas e as cinco linhas seguintes, bem como a correspondência de linha.Como eu seria capaz de fazer isso?
Solução
Para BSD ou GNU grep
você pode usar -B num
para definir quantas linhas antes do jogo, e -A num
para o número de linhas após a partida.
grep -B 3 -A 2 foo README.txt
Se você deseja o mesmo número de linhas antes e depois que você pode usar -C num
.
grep -C 3 foo README.txt
Isto irá mostrar 3 linhas antes e 3 linhas depois.
Outras dicas
-A
e -B
vai trabalhar, como vai -C n
(para n
linhas de contexto), ou apenas -n
(para n
linhas de contexto...contanto que n é de 1 a 9).
confirmação funciona com argumentos semelhantes, como o grep, e aceita -C
.Mas geralmente é melhor para a pesquisa através do código.
grep astring myfile -A 5 -B 5
Que vai grep "meuficheiro" para "astring", e mostrar 5 linhas antes e depois de cada partida
Eu normalmente uso
grep searchstring file -C n # n for number of lines of context up and down
Muitas das ferramentas como o grep também tem realmente grande homem arquivos também.Eu me encontrar referindo-se a grep homem de página muito, porque há tanta coisa que você pode fazer com ele.
man grep
Muitas ferramentas GNU também tem um página de informação de que pode ter uma informação mais útil além disso, a página de man.
info grep
Procure por "17655" em "/some/file.txt" mostrando 10 linhas de contexto antes e depois (usando Awk), saída precedido com o número da linha seguido por dois-pontos.Use esta no Solaris quando o 'grep' não dá suporte a "-[ACB]" opções".
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;
Use grep
$ grep --help | grep -i context
Context control:
-B, --before-context=NUM print NUM lines of leading context
-A, --after-context=NUM print NUM lines of trailing context
-C, --context=NUM print NUM lines of output context
-NUM same as --context=NUM
ripgrep
Se você se preocupa com o desempenho, use ripgrep
o que tem sintaxe semelhante à grep
, e.g.
rg -C5 "pattern" .
-C
,--context NUM
- Mostrar NUM linhas antes e depois de cada partida.
Existem também parâmetros, tais como -A
/--after-context
e -B
/--before-context
.
A ferramenta é construída em cima de A ferrugem do mecanismo de regex o que o torna muito eficiente sobre a grande quantidade de dados.
$grep thestring thefile -5
-5 você recebe 5 linhas acima e abaixo do jogo 'thestring' é equivalente a -C 5 OU -A 5 -B 5
Grep tem uma opção chamada Context Line Control
, você pode usar o --contect
em que, simplesmente,
| grep -C 5
ou
| grep -5
Deve fazer o truque
Aqui é o @Ygor solução 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:Substituir a
e b
variáveis com o número de linhas antes e depois.
Ele é especialmente útil para o sistema que não suporte o grep do -A
, -B
e -C
parâmetros.