linux - metacaracteres - if expresiones regulares bash
Salida de resaltado de color basada en expresiones regulares en shell (8)
Me gustaría saber si puedo resaltar en color la salida de un comando de shell que coincida con ciertas cadenas.
Por ejemplo, si ejecuto myCommand, con la siguiente salida:
> myCommand
DEBUG foo bar
INFO bla bla
ERROR yak yak
Me gustaría que todas las líneas que coincidan con ^ ERROR / s. * Estén resaltadas en rojo.
Del mismo modo, me gustaría que se aplicara el mismo resaltado a la salida de grep, menos, etc.
EDITAR: Probablemente debería mencionar que, idealmente, me gustaría habilitar esta función globalmente a través de la opción ''perfil'' en mi .bashrc.
Hay una respuesta en superuser.com :
your-command | grep -E --color ''pattern|$''
o
your-command | grep --color ''pattern/|$''
Esto "coincidirá con su patrón o el final de línea en cada línea. Solo el patrón se resaltará ..."
Podrías intentarlo (quizás necesite un poco más de escape):
BLUE="$(tput setaf 4)"
BLACK="$(tput sgr0)"
command | sed "s/^ERROR /${BLUE}ERROR ${BLACK}/g"
Probablemente podría habilitarlo para comandos específicos usando alias y funciones de shell definidas por el usuario sin demasiados problemas. Si tus errores de coloración supongo que quieres procesar stderr. Dado que stderr en búfer, probablemente querrá alinearlo en línea con el envío a través de un fifo.
Puede usar el comando hl disponible en github:
git clone http://github.com/mbornet-hl/hl
Entonces :
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 utilizar hasta 42 colores diferentes de texto.
Puedes usar programas como:
- spc (supercat)
- grc (colorante genérico)
- highlight
- histring
- pygmentize
- grep --color
Puedes hacer algo como esto, pero los comandos no verán un tty (algunos rechazarán correr o comportarse de manera diferente o hacer cosas extrañas):
exec > >(histring -fEi error) # Bash
Si desea habilitar esto globalmente, querrá una función 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 se envía a un terminal).
No conozco ningún terminal “convencional” con esta característica. Se hace fácilmente en Emacs, en un búfer de term
: configure font-lock-keywords
de font-lock-keywords
para term-mode
.
Sin embargo, debe pensar detenidamente si realmente desea esa característica todo el tiempo. ¿Qué sucede si el comando tiene sus propios colores (por ejemplo, grep --color
, ls --color
)? Tal vez sería mejor definir un alias corto para un comando del colorizador y ejecutar myCommand 2>&1|c
cuando desee colorear la salida de myCommand
. También podría alias algunos comandos específicos de siempre colorear .
Tenga en cuenta que el estado de retorno de una canalización es su último comando, por lo que si ejecuta myCommand | c
myCommand | c
, obtendrá el estado de c
, no myCommand
. Aquí hay una envoltura de bash que evita este problema, que puede usar como w myCommand
:
w () {
"$@" | c
return $PIPESTATUS[0]
}
Tratar
tail -f yourfile.log | egrep --color ''DEBUG|''
donde DEBUG es el texto que desea resaltar.
Utilice 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 puedes canalizar tu salida
... | awk "$COLORIZE_AWK_COMMAND"
printf se utiliza en los patrones, por lo que no imprimimos una nueva línea, solo establezca el color.