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