Como obtenho linhas antes / depois do grep resultar em bash?

151

Oi eu sou muito novo para bash programação. Eu quero uma maneira de pesquisar em um determinado texto. Para isso eu uso a grepfunção:

grep -i "my_regex"

Isso funciona. Mas dado o dataseguinte:

This is the test data
This is the error data as follows
. . . 
. . . .
. . . . . . 
. . . . . . . . .
Error data ends

Depois de encontrar a palavra error(usando grep -i error data), desejo encontrar as 10 linhas que seguem a palavra error. Portanto, minha saída deve ser:

    . . . 
    . . . .
    . . . . . . 
    . . . . . . . . .
    Error data ends

Existem maneiras de fazer isso?

sriram
fonte
Pela sua descrição, parece que você deseja as 10 linhas que seguem a palavra error.
Thomasw
Isso responde sua pergunta? grep um arquivo, mas mostra várias linhas circundantes?
Advogado Orgânico

Respostas:

266

Você pode usar as teclas -Be -Apara imprimir linhas antes e depois da partida.

grep -i -B 10 'error' data

Irá imprimir as 10 linhas antes da partida, incluindo a própria linha correspondente.

Jon Lin
fonte
1
Obrigado, isso está funcionando. Mas quando tentei armazenar essa execução na variável assim test=$(grep -i -B 10 'error' data)e imprimi-la usando echo $test, recebo as linhas longas retas como saída.
sriram 16/09
1
Graças eu descobri que eu preciso fazer como este echo "$test", em vez deecho $test
sriram
25
-C 10imprimirá 10 linhas antes e depois de uma só vez!
Joshua Pinter
existe uma maneira de fazer isso usando um ponto antes específico? diga o comprimento que eu tenho que pegar antes é variável?
Erudaki 17/07/19
31

Isso imprime 10 linhas de contexto à direita após linhas correspondentes

grep -i "my_regex" -A 10

Se você precisar imprimir 10 linhas do contexto inicial antes de combinar as linhas,

grep -i "my_regex" -B 10

E se você precisar imprimir 10 linhas de contexto de saída inicial e final.

grep -i "my_regex" -C 10

Exemplo

user@box:~$ cat out 
line 1
line 2
line 3
line 4
line 5 my_regex
line 6
line 7
line 8
line 9
user@box:~$

Grep normal

user@box:~$ grep my_regex out 
line 5 my_regex
user@box:~$ 

Grep linhas correspondentes exatas e 2 linhas após

user@box:~$ grep -A 2 my_regex out   
line 5 my_regex
line 6
line 7
user@box:~$ 

Grep linhas correspondentes exatas e 2 linhas antes

user@box:~$ grep -B 2 my_regex out  
line 3
line 4
line 5 my_regex
user@box:~$ 

Grep linhas correspondentes exatas e 2 linhas antes e depois

user@box:~$ grep -C 2 my_regex out  
line 3
line 4
line 5 my_regex
line 6
line 7
user@box:~$ 

Referencia: manpage grep

-A num
--after-context=num

    Print num lines of trailing context after matching lines.
-B num
--before-context=num

    Print num lines of leading context before matching lines.
-C num
-num
--context=num

    Print num lines of leading and trailing output context.
Charlotte Russell
fonte
3
Bom, ive tinha que olhar isso algumas vezes agora, talvez eu possa lembrar dele como -A (PÓS) -B (NTES) -C (CONTEXTO)
Opentuned
11

A maneira de fazer isso está perto do topo da página do manual

grep -i -A 10 'error data'
Ray Toal
fonte
8

Tente o seguinte:

grep -i -A 10 "my_regex"

-A 10 significa, imprima dez linhas após a correspondência para "my_regex"

Desislav Kamenov
fonte