Come posso recuperare le righe prima / dopo il risultato grep in bash?


151

Ciao, sono molto nuovo nella programmazione bash. Voglio un modo per cercare in un dato testo. Per questo uso la grepfunzione:

grep -i "my_regex"

Che funzioni. Ma visto dataquesto:

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

Una volta trovata la parola error(usando grep -i error data), desidero trovare le 10 righe che seguono la parola error. Quindi il mio output dovrebbe essere:

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

Ci sono modi per farlo?


Dalla tua descrizione sembra che tu voglia le 10 righe che seguono la parola error.
ThomasW

Risposte:


266

Puoi usare -Be -Aper stampare le linee prima e dopo la partita.

grep -i -B 10 'error' data

Stampa le 10 righe prima della corrispondenza, inclusa la riga corrispondente.


1
Grazie sta funzionando. Ma quando ho provato a memorizzare questa esecuzione nella variabile in questo modo test=$(grep -i -B 10 'error' data)e stamparla usando echo $test, ho ottenuto le linee lunghe diritte come output.
sriram,

1
Grazie ho capito che devo fare così echo "$test"piuttosto cheecho $test
sriram

25
-C 10stamperà 10 righe prima e dopo in un colpo solo!
Joshua Pinter,

c'è un modo per farlo usando un punto prima specifico? dire che la lunghezza che devo prendere prima è variabile?
Erudaki,

31

Questo stampa 10 linee di contesto finale dopo aver abbinato le linee

grep -i "my_regex" -A 10

Se devi stampare 10 righe di contesto iniziale prima di abbinare le righe,

grep -i "my_regex" -B 10

E se è necessario stampare 10 righe di contesto di output iniziale e finale.

grep -i "my_regex" -C 10

Esempio

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 normale

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

Grep esatte linee corrispondenti e 2 righe dopo

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

Grep linee esatte corrispondenti e 2 linee prima

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

Grep linee esatte corrispondenti e 2 linee prima e dopo

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

Riferimento: 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.

3
Bene, ho dovuto cercarlo un paio di volte, forse me lo ricordo come -A (FTER) -B (EFORE) -C (ONTEXT)
Opentuned

11

Il modo per farlo è vicino alla parte superiore della pagina man

grep -i -A 10 'error data'

8

Prova questo:

grep -i -A 10 "my_regex"

-A 10 significa, stampa dieci righe dopo la corrispondenza a "my_regex"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.