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. Ejecute cat -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 pasar grep
. 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.
grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'
El siguiente awk
fragmento extrae el texto rojo, incluso cuando es multilínea.
awk -v RS='\033' '
match($0, /^\[[0-9;]*m/) {
color = ";" substr($0, 2, RLENGTH-2) ";";
$0 = substr($0, RLENGTH+1);
gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
red = (color ~ /1;*$/)
}
red'
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).
awk -v RS='\033' '
match($0, /^\[[0-9;]*m/) {
color = ";" substr($0, 2, RLENGTH-2) ";";
printf "\033%s", substr($0, 1, RLENGTH);
$0 = substr($0, RLENGTH+1);
gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
desired = (color ~ /[15];*$/)
}
desired'
>&1
? Quiero decir, las cosas rojas no desaparecen si tú2>/dev/null
, ¿verdad?