2010-01-30 10 views
41

Tengo un archivo de texto llamado compare.txt que quiero extraer de la línea que sigue a cada línea que contiene el patrón "nmse_gain_constant". El siguiente comando mí se acerca:¿Cómo me deshago de "-" separador de línea cuando uso grep con líneas de contexto?

grep -A 1 nmse_gain_constant compare.txt | grep -v nmse_gain_constant 

Pero esto incluye un separador "-" línea entre cada línea de texto deseado. ¿Alguna idea fácil de cómo deshacerse de las líneas "-"?

Le daré un ejemplo de texto aquí, pero los caracteres "-" se interpretan erróneamente en esta publicación web como caracteres de control y lo que usted vería es incorrecto.

Respuesta

3

Una solución será:

grep -A 1 nmse_gain_constant compare.txt | grep -v nmse_gain_constant | grep -v "\-\-" 
+0

Esto funciona bien. ¡Gracias! – Michael

16

Bueno, el interruptor A por defecto añadirá esos caracteres, por lo que no es ningún misterio.

man grep estados:

-A NUM 

    Places a line containing a group separator (--) between 
    contiguous groups of matches. With the -o or --only-matching 
    option, this has no effect and a warning is given. 

pero se puede utilizar un simple sed para limpiar el resultado:

yourgrep | sed '/^--$/d' 
+0

Esto funciona genial. Gracias. – Michael

6

No hay necesidad de tubería a tantos greps o utilizar otras herramientas (por ejemplo, sED) si se utiliza AWK:

awk '/nmse_gain_constant/{getline;print }' compare.txt 
+1

para grep -B uso: awk '/ regex/{print x; impresión }; {x = $ 0} ' –

+0

una explicación de la línea de obtención; la parte de impresión del comando awk se adaptaría a esta respuesta ya que la mayoría de las personas que intentan grep cuando deberían llamar no están familiarizadas con las expresiones awk utilizadas para obtener resultados equivalentes de grep – Steen

21

Hay un parámetro no documentado de grep: "--group-separa tor ", que anula el valor predeterminado" - ". Puede configurarlo en "" para deshacerse del doble guión. Sin embargo, todavía obtienes una línea vacía. Tuve el mismo problema y encontré este parámetro leyendo el código fuente de grep.

+9

use --no-group-separator (vea debajo) –

+0

incluso si configuro '--group-separator =" "', el separador de grupos no está realmente vacío, pero aún así se pone de color. Entonces, en lugar de una línea vacía, la línea de separación contiene el código de color, es decir '[[36m [[K [[m [[K'. ¿Hay alguna forma de desactivar la coloración del separador, manteniendo grep '--color = always'? –

+1

no existe tal opción en mac para 'grep (BSD grep) 2.5.1-FreeBSD' – Tim

62

hago esto:

grep ... | grep -v -- "^--$" 

Pero esto funciona también!

grep --no-group-separator ... 

Y no escupe ese "-" o incluso una línea en blanco.

+9

'grep: opción no reconocida '--no-group-separator'' en Mac OS X – krookedking

+0

Esto funciona en Linux, RHEL 6.8 es específico. – cryptic0

Cuestiones relacionadas