web-dev-qa-db-fra.com

Comment récupérer des lignes avant / après le résultat de grep dans bash?

Salut, je suis très nouveau à la programmation bash. Je veux un moyen de chercher dans un texte donné. Pour cela j'utilise la fonction grep:

grep -i "my_regex"

Ça marche. Mais étant donné la data comme ceci:

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

Une fois que j'ai trouvé le mot error (en utilisant grep -i error data), je souhaite trouver les 10 lignes qui suivent le mot error. Donc, ma sortie devrait être:

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

Y a-t-il des moyens de le faire?

123
sriram

Vous pouvez utiliser -B et -A pour imprimer des lignes avant et après la correspondance.

grep -i -B 10 'error' data

Imprimera les 10 lignes avant le match, y compris la ligne correspondante.

224
Jon Lin

Ceci affiche 10 lignes de contexte de fin après les lignes correspondantes

grep -i "my_regex" -A 10

Si vous devez imprimer 10 lignes de contexte avant les lignes correspondantes,

grep -i "my_regex" -B 10

Et si vous devez imprimer 10 lignes de contexte de sortie de début et de fin.

grep -i "my_regex" -C 10

Exemple

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:~$ 

lignes exactes de correspondance Grep et 2 lignes après

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

lignes exactes Grep et 2 lignes avant

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

lignes exactes Grep et 2 lignes avant et après

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

Référence: 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.
22
Charlotte Russell

Pour ce faire, vous vous trouvez en haut de la page de manuel.

grep -i -A 10 'error data'
9
Ray Toal

Essaye ça:

grep -i -A 10 "my_regex"

-A 10 signifie, affiche dix lignes après la correspondance avec "my_regex"

7
Desislav Kamenov