2010-11-24 4 views
36

Me gustaría saber si puedo resaltar en color la salida de un comando de shell que coincida con ciertas cadenas.Salida de resaltado de color basada en regex en shell

Por ejemplo, si me quedo myCommand, con el resultado a continuación:.

> myCommand 
DEBUG foo bar 
INFO bla bla 
ERROR yak yak 

me gustaría todas las líneas de juego^ERROR \ s * a destacar rojo.

Del mismo modo, me gustaría destacar el mismo que se aplica a la salida de grep, etc ... menos

EDIT: Probablemente debería mencionar que idealmente me gustaría activar esta función a nivel mundial a través de una la opción 'perfil' en mi .bashrc.

Respuesta

11

Si desea habilitar esto globalmente, querrá una característica de terminal, no un proceso en el que canalice la salida, porque una tubería sería perjudicial para algún comando (dos problemas son que stdout y stderr aparecerían fuera- de orden y almacenado en búfer, y que algunos comandos simplemente se comportan de manera diferente cuando salen a un terminal).

No conozco ningún terminal "convencional" con esta característica. Se realiza fácilmente en Emacs, en un buffer term: configure font-lock-keywords para term-mode.

Sin embargo, debe pensar cuidadosamente si realmente desea esa función todo el tiempo. ¿Qué sucede si el comando tiene sus propios colores (por ejemplo, grep --color, ls --color)? Quizás sería mejor definir un alias corto en colorizer command y ejecutar myCommand 2>&1|c cuando desee colorear la salida de myCommand. También puede alias some specific always-colorize commands.

Tenga en cuenta que el estado de retorno de una tubería es su última orden , por lo que si se ejecuta myCommand | c, obtendrá el estado de c, no myCommand.Aquí está una envoltura bash que evita este problema, que se puede utilizar como w myCommand:

w() { 
    "[email protected]" | c 
    return $PIPESTATUS[0] 
} 
+0

Algunos puntos buenos, gracias. – Joel

+0

Tenga en cuenta que 'w' es una utilidad en Linux similar a' who'. –

13

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" 
+0

Para resaltar los errores de gcc y las advertencias de make, guarde lo siguiente como '~/bin/errmake':' make $ @ 2> & 1 | sed -e "s/error:/$ (tput setab 1; tput bold) error: $ (tput sgr0)/g" -e "s/advertencia:/$ (tput setab 4; tput bold) advertencia: $ (tput sgr0)/g "' – Mark

24

puede utilizar programas tales como:

Puede hacer algo como esto, pero los comandos no verá un TTY (algunos se niegan a correr o comportarse de manera diferente o hacer cosas extrañas):

exec > >(histring -fEi error) # Bash 
1

Probablemente pueda habilitarlo para comandos específicos usando alias y funciones de shell definidas por el usuario sin demasiados problemas. Si tus errores de coloración asumo que quieres procesar stderr. Como stderr en unsbuffered, probablemente quieras alinearlo en buffer enviándolo a través de un fifo.

36

hay una respuesta en superuser.com:

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

o

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

Este partido " su patrón o el final de línea en cada línea. Solo el patrón está resaltado ... "

+0

Compruebe la página del manual 'grep', especialmente la documentación de la variable de entorno' GREP_COLORS'. – chepner

+0

Aquí hay una versión de esto como una función que puede agregar a .bashrc/.bash_profile (reemplazar --- con saltos de línea!): # Resalte todas las ocurrencias de una cierta cadena en el texto canalizado a esta función. --- # Ejemplo de uso: echo 'hello world' | hilight world --- function highlight {grep -E --color "$ 1 | \ $"; } – npgall

0

Trate

tail -f yourfile.log | egrep --color 'DEBUG|' 

donde DEBUG es el texto que desea resaltar.

1

Puede utilizar el comando hl avalaible en github:
clon de git http://github.com/mbornet-hl/hl

continuación:
myCommand | hl -r '^ ERROR. *'

Puede usar el archivo de configuración $ HOME/.hl.cfg para simplificar la línea de comandos.
hl está escrito en C (la fuente está disponible). Puede usar hasta 42 colores diferentes de texto.

0

Use awk.

COLORIZE_AWK_COMMAND='{ print $0 }' 
if [ -n "$COLORIZE" ]; then 
    COLORIZE_AWK_COMMAND=' 
    /pattern1/ { printf "\033[1;30m" } 
    /pattern2/ { printf "\033[1;31m" } 
    // { print $0 "\033[0m"; }' 
fi 

luego se puede canalizar la salida

... | awk "$COLORIZE_AWK_COMMAND" 

printf se utiliza en los patrones por lo que no imprimir una nueva línea, acaba de establecer el color.

Cuestiones relacionadas