Marque las ocurrencias de palabras clave con un color diferente

13

Tengo un programa que escupe una salida para stdoutgustar:

[OK]      Something is ok
[OK]      Something else is also ok
[FAIL]    This does not look good
[FAIL]    Neither does this
[OK]      At least this is fine

Para detectar más fácilmente las fallas de la salida, me gustaría marcar las ocurrencias de la palabra clave FAILcon rojo sin descartar los otros mensajes. Sería bueno si también pudiera resaltar las OKpalabras clave con verde :).

Hacer una canalización egrep --color FAILsolo mostrará las líneas donde FAILestá presente la palabra clave.

Theodor
fuente
1
Para obtener una grepsolución, visite unix.stackexchange.com/a/34322
manatwork el
¿tiene acceso para cambiar el código fuente? ¿Es un script bash?
h3rrmiller 01 de
@manatwork Desde el enlace que ha especificado chasqué mi camino a stackoverflow.com/questions/972370 y con un poco tail -fy awkla magia, soy bueno para ir =)
Theodor

Respuestas:

10

Basado en manatworkel pequeño truco brillante "o nada" en la otra pregunta, ofrezco esto, que agrega la capacidad de obtener dos colores destacados:

 $ myprogram | \
   GREP_COLORS='mt=01;32' egrep --color=always '\[OK\]|' | \
   GREP_COLORS='mt=01;31' egrep --color=always '\[FAIL\]|'

Es decir, ejecuta grepel resultado dos veces, con una GREP_COLORSvariable de entorno diferente cada vez.

El valor '01; 32 'significa "negrita verde", y el otro significa "negrita rojo". Consulte el artículo de Wikipedia sobre códigos ANSI para obtener más ideas.

Por desgracia, esto requiere GNU grep versión 2.5.3 o superior. Las versiones anteriores de GNU grep admitían un mecanismo de coloración diferente, pero esas versiones tienen un error que le impide usar la función en una tubería más de una vez. BSD grep emula el antiguo mecanismo de coloración grep de GNU, y funcionará dos veces en una tubería, pero grita sobre "subexpresión vacía" debido al manatworkhack.

Puede eliminar las barras diagonales inversas al final de las dos primeras líneas para que sea una sola línea. Lo acabo de dividir aquí para mayor claridad y para jugar bien con el formato de página SE.

Warren Young
fuente
Eso es brillante de hecho! Pero por alguna razón, el script no parece resaltar la segunda declaración en mi máquina. Estoy ejecutando CentOS 5.
Theodor
2
Lo que sucede aquí es que CentOS 5 incluye un GNU grep lo suficientemente antiguo como para que no sea compatible GREP_COLORS, en plural. Utiliza GREP_COLORsolo el método anterior , y ese método tiene un error que le impide hacer lo correcto. Si cambia el comando a utilizar GREP_COLOR=32y tal, solo cambiará el color de resaltado de la primera coincidencia. Si canaliza el resultado hexdump -cpuede ver que agregar el segundo egrepcomando hace algo, pero no es ANSI legal. En pocas palabras: debe actualizar greppara que esto funcione correctamente.
Warren Young
Jaja, ese es un comentario tan perspicaz. Sí, CentOS5 se está volviendo un poco viejo, como ocurre con muchos sistemas operativos: s que se ejecutan en máquinas viejas que escupen mensajes de registro antiguos y abandonados :) Trataré de ver si no es posible una actualización a centos6.
Theodor
Yo sólo he comprobado mi solución en un CentOS 6 cuadro, y lo hace trabajar allí, lo que confirma mi diagnóstico. (Las pruebas anteriores se realizaron en servidores Ubuntu). EL6 se entrega con GNU grep 2.6.3. Curiosamente, también corrigieron el GREP_COLORerror (singular), a pesar de que la función fue obsoleta tan pronto como se reemplazó.
Warren Young
No puedo entender cómo esto resuelve el problema, ya que la primera grep filtrará todos los "FAIL" por lo que no habrá nada para el segundo a grep ..
Laertis
1

Puede usar multitail o ccze para esto, ambos permiten que las configuraciones describan expresiones regulares para combinar y colores.

Netch
fuente
1

Basado en la respuesta de Warren Young, escribí este script de Python que hace lo mismo de manera más elegante y con mucho menos tipeo. Así es como usarías ese script:

cat yourfile | himul '\[OK\]' '\[FAIL\]'
kirubakaran
fuente