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


151

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

grep -i "my_regex"

Ça marche. Mais étant donné dataceci:

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?


D'après votre description, il semble que vous vouliez que les 10 lignes suivent le mot error.
ThomasW

Réponses:


266

Vous pouvez utiliser -Bet -Apour imprimer des lignes avant et après le match.

grep -i -B 10 'error' data

Imprime les 10 lignes avant le match, y compris la ligne correspondante elle-même.


1
Merci, cela fonctionne. Mais quand j'ai essayé de stocker cette exécution dans la variable comme ceci test=$(grep -i -B 10 'error' data), et de l'imprimer en utilisant echo $test, j'obtiens les longues lignes droites en sortie.
sriram le

1
Merci, j'ai compris que je devais faire comme ça echo "$test"plutôt queecho $test
sriram

25
-C 10imprimera 10 lignes avant ET après d'un seul coup!
Joshua Pinter

y a-t-il un moyen de le faire en utilisant un point avant spécifique? dire que la longueur que je dois saisir avant est variable?
Erudaki

31

Cela imprime 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 principal avant de faire correspondre les lignes,

grep -i "my_regex" -B 10

Et si vous avez besoin d'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:~$ 

Grep lignes correspondantes exactes et 2 lignes après

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

Grep lignes correspondantes exactes et 2 lignes avant

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

Grep lignes correspondantes exactes 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.

3
Bien, j'ai dû regarder cela plusieurs fois maintenant, peut-être que je m'en souviens comme -A (FTER) -B (EFORE) -C (ONTEXT)
Ouverture

11

La façon de procéder se trouve en haut de la page de manuel

grep -i -A 10 'error data'

8

Essaye ça:

grep -i -A 10 "my_regex"

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.