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?

sriram
la source
D'après votre description, il semble que vous vouliez que les 10 lignes suivent le mot error.
ThomasW
Est-ce que cela répond à votre question? grep un fichier, mais affiche plusieurs lignes environnantes?
Organic Advocate

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.

Jon Lin
la source
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.
Charlotte Russell
la source
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'
Ray Toal
la source
8

Essaye ça:

grep -i -A 10 "my_regex"

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

Desislav Kamenov
la source