Mudar a cor é feito através de seqüências de escape embutidas no texto. Invariavelmente, os programas emitem seqüências de escape ANSI , porque é isso que virtualmente todos os terminais suportam atualmente.
A seqüê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). Números no intervalo 30–39 definem a cor de 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, pode usar alguma variante como \e[0;31m
para primeiro redefinir todos os atributos ou \e[3;31
para também alternar itálico (que muitos terminais não suportam).
Em 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. Note que você terá que dobrar qualquer barra invertida que você queira passar para grep
. Em /bin/sh
, você pode usar "$(printf \e)"
ou digitar um caractere de escape literal.
Com a opção -o
do GNU grep, o seguinte snipet filtra texto vermelho, assumindo que ele começa com a seqüência de escape \e[31m
, termina com \e[0m
ou \e[30m
na mesma linha e não contém escape embutido sequência.
grep -Eo $'\e\[31m[^\e]*\e\[[03]?m'
O fragmento awk a seguir extrai texto em vermelho, mesmo quando é multilinha.
awk -v RS='3' '
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 retém os comandos de mudança de cor, o que pode ser útil se você estiver filtrando várias cores (aqui leia e magenta).
awk -v RS='3' '
match($0, /^\[[0-9;]*m/) {
color = ";" substr($0, 2, RLENGTH-2) ";";
printf "3%s", substr($0, 1, RLENGTH);
$0 = substr($0, RLENGTH+1);
gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
desired = (color ~ /[15];*$/)
}
desired'