¿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?


De su descripción parece que quiere que las 10 líneas sigan la palabra error.
— ThomasW

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.


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.

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'

8

Prueba esto:

grep -i -A 10 "my_regex"

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.