Estou executando um utilitário que não oferece uma maneira de filtrar sua saída. Nada no texto da saída indica que uma função específica falhou, mas aparece em vermelho. A saída é tão longa que, no final, quando informa um número de erros, nem sempre posso rolar para ver a saída em que ocorreu o erro.
Como filtrar texto não vermelho?
pseudo-código:
dolongtask | grep -color red
Editar
O comando emite outras cores também e eu preciso ser capaz de filtrar para fora todo o texto que não é vermelho. Além disso, a coloração do texto é multilinha.
>&1
? Quero dizer, o material vermelho não desaparece se você2>/dev/null
, certo?Respostas:
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. Executecat -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 passargrep
. 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.Os seguintes
awk
fragmento a extrai o texto em vermelho, mesmo quando é multilinha.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).
fonte
printf '\e[31m'; awk …; printf '\e[0m'
Você pode fazer com que o grep procure caracteres de controle, alguns dos quais são responsáveis por criar as cores bonitas no terminal.
Por exemplo, isso ecoa um "teste" vermelho no grep, que o encontra devido a estar cercado por caracteres de controle:
A
--color=none
é apenas para se certificar grep não se aplica a sua própria colorização à saída combinado, mas imprime toda a linha fielmente para que os caracteres de controle serão interpretados pelo shell.fonte
grep -E $'\033\[0?[01];31m.+?\033\[0?0m'
ougrep -Po '\033\[0?[01]+;31m\K.+?(?=\033\[0?0m)'
testar especificamente o vermelho?[[:cntrl:]]
. Eu testei o seu e eles trabalham para mim, ou seja. combinando vermelho e não combinando com outras cores.