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 \edesigna 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[0mrestablece todos los atributos a su valor predeterminado. Ejecute cat -vpara verificar lo que imprime el programa, podría usar alguna variante, como \e[0;31mrestablecer primero todos los atributos, o \e[3;31tambié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 -oopción GNU , el siguiente fragmento filtra el texto rojo, suponiendo que comienza con la secuencia de escape \e[31m, termina con una \e[0mo \e[30men la misma línea y no contiene ninguna secuencia de escape incrustada.
grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'
El siguiente awkfragmento 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?