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


Hola, soy muy nuevo en la programación bash. Quiero una forma de buscar en un Texto dado. Para eso yo uso grep función:

grep -i "my_regex"

Eso funciona. Pero dado el data Me gusta esto :

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

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

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

¿Hay alguna forma de hacerlo?


75
2017-09-16 06:15


origen


Respuestas:


Puedes usar el -B y -A para 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.


153
2017-09-16 06:16



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

grep -i -A 10 'error data'

8
2017-09-16 06:17



Esto imprime 10 líneas de contexto posterior después de hacer coincidir las líneas

grep -i "my_regex" -A 10

Si necesita imprimir 10 líneas de contexto principal antes de hacer coincidir 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 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.

8
2017-07-12 08:12



Prueba esto:

grep -i -A 10 "my_regex"

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


5
2017-09-16 06:17