2012-06-19 12 views
5

¿Es posible usar grep para hacer coincidir solo líneas con números en un rango predeterminado? Por ejemplo, quiero enumerar todas las líneas con números en el rango [1024, 2048] de un registro que contiene la palabra 'error'.líneas grep match only en un rango especificado

Me gustaría mantener la funcionalidad '-n', es decir, tener el número de la línea coincidente en el archivo.

Respuesta

5
sed -n '1024,2048{/error/{=;p}}' | paste - - 

Aquí /error/ es un patrón de coincidencia y = imprime el número de línea.

+0

Acepto su respuesta porque también imprime los números de línea originales. No entiendo muy bien el bit con {/ error/{=; p}} ¿podría explicar eso por favor? –

+0

/error/es el patrón que debe coincidir dentro del rango del número proporcionado. –

+0

¡Guau! ¡Ahora aprendo un nuevo truco de sed! ¡Esto es poderoso! – Viet

7

usar sed en primer lugar:

SED -ne '1024,2048p' | grep ...

-n dice no imprimir líneas, 'x, y, p' dice líneas de impresión xy incluido (anula el -n)

+0

La razón creo que la solución de príncipe Juan Wesley es mejor es que también imprime los números de línea originales, mientras que aquí voy a tener su número en el rango especificado. Todavía +1. –

3

Awk es una buena herramienta para el trabajo:

$ awk 'NR>=1024 && NR<=2048 && /error/ {print NR,$0}' file 

En awk la variable NR contiene el número de línea actual y $0 contiene la propia línea.

Las ventajas de utilizar awk es que puede cambiar fácilmente la salida para mostrarla como lo desee. Por ejemplo, para separar el número de línea de la línea con dos puntos seguido de una tabulación:

$ awk 'NR>=1024 && NR<=2048 && /error/ {print NR,$0}' OFS=':\t' file 
Cuestiones relacionadas