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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top