27 votos

Color de resaltado de salida basados en regex en shell

Me gustaría saber si puedo resaltar el color de la salida de un comando de la shell que coincide con ciertas cadenas.

Por ejemplo, si quiero correr myCommand, con el siguiente resultado:

> myCommand
DEBUG foo bar
INFO bla bla
ERROR yak yak

Me gustaría que todas las líneas que coincidan ^ERROR\s.* para ser marcado en rojo.

Del mismo modo, me gustaría que el mismo destacando a ser aplicado a la salida de grep, menos, etc...

EDIT: yo probablemente debería mencionar que, idealmente, me gustaría habilitar esta función a nivel mundial a través de un 'perfil' opción en mi .bashrc.

20voto

Zsolt Ringhofer Puntos 31

Hay una respuesta en superuser.com:

your-command | grep -E --color 'pattern|$'

o

your-command | grep --color 'pattern\|$'

Este será "el partido de su patrón o el final de la línea en cada línea. Sólo el patrón se destacaron..."

19voto

Dennis Williamson Puntos 105818

Puede utilizar programas como:

Usted puede hacer algo como esto, pero los comandos no vamos a ver un tty (algunos se niegan a ejecutar o se comporten de manera diferente o hacer cosas raras):

exec > >(histring -fEi error)    # Bash

10voto

Benoit Puntos 35553

Usted podría tratar (tal vez necesita un poco más de escape):

BLUE="$(tput setaf 4)"
BLACK="$(tput sgr0)"
command | sed "s/^ERROR /${BLUE}ERROR ${BLACK}/g"

10voto

Gilles Puntos 37537

Si desea habilitar esta a nivel global, usted querrá un terminal característica, no un proceso en el que la tubería de salida, debido a un tubo de ser perjudicial para algunos de comandos (dos problemas que stdout y stderr parece fuera de orden y en el búfer, y que algunos comandos sólo se comportan de manera diferente cuando la salida de un terminal).

Yo no conozco a ningún "convencional" de la terminal con esta característica. Es fácil de hacer en Emacs, en un term buffer: configure font-lock-keywords para term-mode.

Sin embargo, usted debe pensar cuidadosamente si tu realmente quieres que disponen de todo el tiempo. ¿Qué pasa si el comando tiene sus propios colores (por ejemplo grep --color, ls --color)? Tal vez sería mejor definir un alias corto a un colorizer de comandos y ejecutar myCommand 2>&1|c cuando se quiere colorear myCommand's de salida. Usted también podría alias algunos específicos de siempre-colorear comandos.

Tenga en cuenta que el estado de retorno de una tubería es su último comando, así que si corres myCommand | c, obtendrá el estado de c, no myCommand. He aquí un bash contenedor que evita este problema, que se puede utilizar como w myCommand:

w () {
  "$@" | c
  return $PIPESTATUS[0]
}

1voto

dietbuddha Puntos 4031

Probablemente se podría habilitar para los comandos específicos de uso de alias y definidas por el usuario funciones de shell wihtout demasiado problema. Si su coloración errores supongo que usted quiere para el proceso de stderr. Desde stderr en unbuffered probablemente desee buffer de línea mediante el envío a través de una fifo.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X