Como limpar a saída de cor stdout / stderr

3

Eu tenho um programa que produziria algo assim:

^[0;33m"2015-02-09 11:42:36 +0700 114.125.x.x access"^[0m

Existe um programa linux que pode limpar essa saída em algo parecido com isto

"2015-02-09 11:42:36 +0700 114.125.x.x access"
    
por Kokizzu 09.02.2015 / 05:46

2 respostas

3

Essas são seqüências de controle ANSI. Não há programas embutidos que removem esses códigos, pelo menos que eu saiba. Um simples script sed , no entanto, fará o trabalho para você:

sed -r 's/\x1b_[^\x1b]*\x1b[\]//g; s/\x1B\[[^m]*m//g'

Usando o acima com sua entrada de amostra:

$ echo $'\e[0;33m"2015-02-09 11:42:36 +0700 114.125.x.x access"\e[0m'  | sed -r 's/\x1b_[^\x1b]*\x1b[\]//g; s/\x1B\[[^m]*m//g'                    
"2015-02-09 11:42:36 +0700 114.125.x.x access"

OSX ou outro sistema BSD

Com o OSX (BSD) sed , os comandos não podem ser encadeados juntamente com ponto e vírgula. Tente, em vez disso:

sed -e 's/\x1b_[^\x1b]*\x1b[\]//g' -e 's/\x1B\[[^m]*m//g'
    
por 09.02.2015 / 05:51
1

A ideia de um script sed está bem (e há vários scripts disponíveis para este propósito), mas o script sugerido poderia ser melhorado:

  • esse fragmento s/\x1b_[^\x1b]*\x1b[\]//g pode ser usado para filtrar o modo de aplicativo comandos . No entanto, é improvável que o leitor encontre esses usados , conforme observado na documentação do xterm:

APC Pt ST
None. xterm implements no APC functions; Pt is ignored. Pt need not be printable characters.

  • se o sublinhado fosse alterado para um colchete quadrado direito ] , então isso corresponderia a algum controles do sistema operacional . Novamente, no entanto, o principal uso daqueles nos terminais usa a terminação variante com BEL7 (ASCII sed ) para títulos no estilo xterm (geralmente usados em strings de prompt do bash / zsh).

Dadas essas considerações, uma primeira parte melhor pode ser uma correspondência não-gulosa para escape \ ou BEL . Mas m faz combinações gananciosas. Em vez de ficar complicado, apenas

s/\x1b\][^\x07]*\x07//g

deve ser suficiente.

O outro pedaço também tem um problema. É muito ganancioso desde o início:

s/\x1B\[[^m]*m//g

porque supõe que depois de se livrar dos comandos do modo aplicativo (ou sistema operacional), as únicas seqüências de escape restantes na saída do shell serão aquelas que alteram os modos de vídeo, isto é, SGR (terminando com %code% ). Com uma ligeira mudança, a expressão filtraria apenas as sequências SGR, e não se empolgaria e removeria tudo começando com um escape [, por exemplo,

s/\x1B\[[;0-9]*m//g

A filtragem de seqüências de escape color pode ser considerada um caso especial na filtragem da saída de terminal para texto simples, conforme respondido em posso programaticamente" gravar em "códigos de controle ANSI para um arquivo usando unix utilidades? uma semana antes desta pergunta ser feita.

Leitura adicional:

por 02.06.2016 / 02:56