A mudança de cor é feita por meio de seqüências de escape incorporadas no texto. Invariavelmente, os programas emitem seqüências de escape ANSI , porque é isso que praticamente todos os terminais suportam atualmente.
A sequência de escape para mudar a cor do primeiro plano para vermelho é \e[31m
, onde \e
designa um caractere de escape (octal 033, hexadecimal 1b, também conhecido como ESC ^[
e várias outras designações). Os números no intervalo de 30 a 39 definem a cor do primeiro plano; outros números definem atributos diferentes. \e[0m
redefine todos os atributos para seu valor padrão. Execute cat -v
para verificar o que o programa imprime, ele pode usar alguma variante, como \e[0;31m
primeiro redefinir todos os atributos ou \e[3;31
também ativar o itálico (que muitos terminais não suportam).
No ksh, bash ou zsh, você pode usar $'…'
para ativar escapes de barra invertida dentro das aspas, o que permite digitar$'\e'
para obter um caractere de escape. Observe que você precisará dobrar qualquer barra invertida para a qual deseja passar grep
. Em /bin/sh
, você pode usar "$(printf \\e)"
ou digitar um caractere de escape literal.
Com a grep -o
opção GNU , o seguinte trecho filtra o texto em vermelho, supondo que ele comece com a sequência de escape \e[31m
, termine com\e[0m
ou \e[30m
na mesma linha e não contém nenhuma sequência de escape incorporada.
grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'
Os seguintes awk
fragmento a extrai o texto em vermelho, mesmo quando é multilinha.
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'
Aqui está uma variação que mantém os comandos de mudança de cor, que podem ser úteis se você estiver filtrando várias cores (aqui vermelho e 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
? Quero dizer, o material vermelho não desaparece se você2>/dev/null
, certo?