2012-09-16 10 views
59

Hola, soy muy nuevo en la programación de bash. Quiero una forma de buscar en un Texto dado. Para eso uso la función grep:¿Cómo obtengo las líneas antes/después del resultado grep en bash?

grep -i "my_regex" 

Eso funciona. Pero dada la data así:

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 de encontrar las 10 líneas que siguen a la palabra error. Entonces mi salida debería ser:

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

¿Hay alguna manera de hacerlo?

+0

Según su descripción, parece que quiere las 10 líneas que siguen la palabra 'error'. – ThomasW

Respuesta

129

Puede usar -B y -A para imprimir líneas antes y después de la coincidencia.

grep -i -B 10 'error' data 

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

+0

Gracias, esto está funcionando. Pero cuando traté de almacenar esta ejecución en la variable como esta 'test = $ (grep -i -B 10 'error' data)', e imprimirlo usando 'echo $ test', obtengo las líneas largas rectas como salida. – sriram

+1

Gracias me di cuenta de que tengo que hacer esto 'echo" $ test "' en lugar de 'echo $ test' – sriram

+1

' -C 10' imprimirá 10 líneas antes Y después de una sola vez! –

5

Prueba esto:

grep -i -A 10 "my_regex" 

-A 10 medios de impresión, diez líneas después del partido a "my_regex"

8

La manera de hacer esto es cerca de la parte superior de la página del manual

grep -i -A 10 'error data' 
3

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

grep -i "my_regex" -A 10 

Si necesita imprimir 10 líneas de contexto antes de que lleva las líneas que coincidan,

grep -i "my_regex" -B 10 

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

grep -i "my_regex" -C 10 

Ejemplo

[email protected]:~$ cat out 
line 1 
line 2 
line 3 
line 4 
line 5 my_regex 
line 6 
line 7 
line 8 
line 9 
[email protected]:~$ 

normal grep

[email protected]:~$ grep my_regex out 
line 5 my_regex 
[email protected]:~$ 

Grep líneas de coincidencia exacta y 2 líneas después de

[email protected]:~$ grep -A 2 my_regex out 
line 5 my_regex 
line 6 
line 7 
[email protected]:~$ 

Grep líneas de coincidencia exacta y 2 líneas antes de

[email protected]:~$ grep -B 2 my_regex out 
line 3 
line 4 
line 5 my_regex 
[email protected]:~$ 

Grep líneas de coincidencia exacta y 2 líneas antes y después de

[email protected]:~$ grep -C 2 my_regex out 
line 3 
line 4 
line 5 my_regex 
line 6 
line 7 
[email protected]:~$ 

Referencia: página de manual 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. 
Cuestiones relacionadas