Estoy ejecutando una utilidad que no ofrece una forma de filtrar su salida. Nada en el texto de la salida indica que una función en particular falló pero se muestra en rojo. El resultado es tan largo que al final, cuando informa algunos # de errores, no siempre puedo desplazarme para ver el resultado donde ocurrió el error.
¿Cómo puedo filtrar el texto no rojo?
pseudocódigo:
dolongtask | grep -color red
Editar
El comando de salida a otros colores también y tengo que ser capaz de filtrar a cabo todo el texto que no es rojo. También el color del texto es multilínea.
>&1
? Quiero decir, las cosas rojas no desaparecen si tú2>/dev/null
, ¿verdad?Respuestas:
El cambio de color se realiza mediante secuencias de escape incrustadas en el texto. Invariablemente, los programas emiten secuencias de escape ANSI , porque eso es lo que prácticamente todos los terminales soportan hoy en día.
La secuencia de escape para cambiar el color de primer plano a rojo es
\e[31m
, donde\e
designa un carácter de escape (octal 033, hexadecimal 1b, también conocido como ESC,^[
y varias otras designaciones). Los números en el rango 30–39 establecen el color de primer plano; otros números establecen diferentes atributos.\e[0m
restablece todos los atributos a su valor predeterminado. Ejecutecat -v
para verificar lo que imprime el programa, podría usar alguna variante, como\e[0;31m
restablecer primero todos los atributos, o\e[3;31
también activar la cursiva (que muchos terminales no admiten).En ksh, bash o zsh, puede usar
$'…'
para habilitar los escapes de barra invertida dentro de las comillas, lo que le permite escribir$'\e'
para obtener un carácter de escape. Tenga en cuenta que tendrá que duplicar cualquier barra invertida a la que desee pasargrep
. En/bin/sh
, puede usar"$(printf \\e)"
o escribir un carácter de escape literal.Con la
grep -o
opción GNU , el siguiente fragmento filtra el texto rojo, suponiendo que comienza con la secuencia de escape\e[31m
, termina con una\e[0m
o\e[30m
en la misma línea y no contiene ninguna secuencia de escape incrustada.El siguiente
awk
fragmento extrae el texto rojo, incluso cuando es multilínea.Aquí hay una variación que conserva los comandos de cambio de color, que podrían ser útiles si está filtrando varios colores (aquí rojo y magenta).
fuente
printf '\e[31m'; awk …; printf '\e[0m'
Puede hacer que grep busque caracteres de control, algunos de los cuales son responsables de crear los bonitos colores en el terminal.
Por ejemplo, esto hace eco de una "prueba" roja en grep, que lo encuentra debido a que está rodeado de caracteres de control:
Esto
--color=none
es solo para asegurarse de que grep no aplique su propia coloración a la salida coincidente, sino que imprima toda la línea fielmente para que el shell interprete los caracteres de control.fuente
grep -E $'\033\[0?[01];31m.+?\033\[0?0m'
ogrep -Po '\033\[0?[01]+;31m\K.+?(?=\033\[0?0m)'
para probar el rojo específicamente.[[:cntrl:]]
. Probé el tuyo y funcionan para mí, es decir. a juego con rojo y no coincidiendo con otros colores.