¿Cómo obtengo líneas antes / después del resultado grep en bash?

151

Hola, soy muy nuevo en la programación bash. Quiero una forma de buscar en un texto dado. Para eso utilizo la grepfunción:

grep -i "my_regex"

Eso funciona. Pero dado lo datasiguiente:

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

Una vez que encontré la palabra error(usando grep -i error data), deseo encontrar las 10 líneas que siguen a la palabra error. Entonces mi salida debería ser:

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

¿Hay alguna forma de hacerlo?

sriram
fuente
De su descripción parece que quiere que las 10 líneas sigan la palabra error.
ThomasW
¿Responde esto a tu pregunta? grep un archivo, pero muestra varias líneas circundantes?
Defensor orgánico

Respuestas:

266

Puede usar -By -Apara imprimir líneas antes y después del partido.

grep -i -B 10 'error' data

Imprimirá las 10 líneas antes del partido, incluida la línea correspondiente.

Jon Lin
fuente
1
Gracias, esto está funcionando. Pero cuando intenté almacenar esta ejecución en la variable como esta test=$(grep -i -B 10 'error' data), e imprimirla usando echo $test, obtengo las líneas rectas largas como salida.
sriram
1
Gracias, me di cuenta de que necesito hacer esto en echo "$test"lugar deecho $test
Sriram
25
-C 10imprimirá 10 líneas antes y después de una sola vez!
Joshua Pinter
¿Hay alguna manera de hacer esto utilizando un punto anterior específico? ¿La longitud que tengo que tomar antes es variable?
Erudaki
31

Esto imprime 10 líneas de contexto final después de las líneas coincidentes

grep -i "my_regex" -A 10

Si necesita imprimir 10 líneas de contexto principal antes de hacer coincidir las líneas,

grep -i "my_regex" -B 10

Y si necesita imprimir 10 líneas de contexto de salida inicial y final.

grep -i "my_regex" -C 10

Ejemplo

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 líneas coincidentes exactas y 2 líneas después

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

Grep líneas coincidentes exactas y 2 líneas antes

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

Grep líneas coincidentes exactas y 2 líneas antes y después

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
fuente
3
Bien, he tenido que buscar esto varias veces, tal vez pueda recordarlo como -A (FTER) -B (EFORE) -C (ONTEXT)
Abierto el
11

La forma de hacerlo es cerca de la parte superior de la página del manual

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

Prueba esto:

grep -i -A 10 "my_regex"

-A 10 significa, imprimir diez líneas después del partido a "my_regex"

Desislav Kamenov
fuente