238 votes

Suppression des couleurs de la sortie

J'ai un script qui produit une sortie avec des couleurs et j'ai besoin de supprimer les codes ANSI.

#!/bin/bash

exec > >(tee log)   # redirect the output to a file but keep it on stdout
exec 2>&1

./somescript

Le résultat est (dans le fichier journal) :

java (pid  12321) is running...@[60G[@[0;32m  OK  @[0;39m]

Je ne savais pas comment mettre le caractère ESC ici, alors j'ai mis @ à sa place.

J'ai changé le script en :

#!/bin/bash

exec > >(tee log)   # redirect the output to a file but keep it on stdout
exec 2>&1

./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"

Mais maintenant il me donne (dans le fichier journal) :

java (pid  12321) is running...@[60G[  OK  ]

Comment puis-je également supprimer ce @[60G ?

Peut-être y a-t-il un moyen de désactiver complètement la coloration pour l'ensemble du script ?

249voto

Jeff Bowman Points 9712

Selon Wikipédia le [m|K] en el sed que vous utilisez est spécifiquement conçue pour gérer les commandes m (la commande de couleur) et K (la commande "effacer une partie de la ligne"). Votre script essaie de fixer la position absolue du curseur à 60 ( ^[[60G ) pour obtenir tous les OK dans une ligne, que votre sed ne couvre pas.

(Correctement, [m|K] devrait probablement être (m|K) ou [mK] parce que vous n'essayez pas de faire correspondre un caractère pipe. Mais ce n'est pas important pour l'instant).

Si vous changez la dernière correspondance dans votre commande en [mGK] ou (m|G|K) vous devriez être en mesure d'attraper cette séquence de contrôle supplémentaire.

./somescript | sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g"

86voto

meustrus Points 856

À mon avis, la plupart de ces réponses tentent trop de restreindre ce que contient le code d'échappement. En conséquence, elles finissent par manquer des codes courants comme [38;5;60m (couleur ANSI de premier plan 60 à partir du mode 256 couleurs).

Ils exigent également -r qui permet à Extensions GNU . Ils ne sont pas nécessaires ; ils permettent simplement une meilleure lecture de la regex.

Voici une réponse plus simple qui gère les échappatoires de 256 couleurs et fonctionne sur les systèmes non GNU sed :

./somescript | sed 's/\x1B\[[0-9;]\{1,\}[A-Za-z]//g'

Cela permettra d'attraper tout ce qui commence par [ , comporte un nombre quelconque de décimales et de points-virgules, et se termine par une lettre. Cela devrait permettre d'attraper tous les séquences d'échappement ANSI courantes .

Pour le plaisir, voici une solution plus large et plus générale (mais peu testée) pour toutes les séquences d'échappement ANSI imaginables :

./somescript | sed 's/\x1B[@A-Z\\\]^_]\|\x1B\[[0-9:;<=>?]*[-!"#$%&'"'"'()*+,.\/]*[][\\@A-Z^_`a-z{|}~]//g'

(et si vous avez le problème SI de @edi9999, ajoutez | sed "s/\x0f//g" à la fin ; cela fonctionne pour toute carte de contrôle en remplaçant 0f avec l'hexagone du caractère non désiré)

63voto

user4674453 Points 140

Je suis tombé sur ansi2txt outil de colorized-logs dans Debian. L'outil supprime les codes de contrôle ANSI de STDIN.

Exemple d'utilisation :

./somescript | ansi2txt

Code source http://github.com/kilobyte/colorized-logs

49voto

JoeAndrieu Points 697

Je n'ai pas pu obtenir de résultats décents avec les autres réponses, mais la suivante a fonctionné pour moi :

somescript | sed -r "s/[[:cntrl:]]\[[0-9]{1,3}m//g"

Si je ne supprime que le caractère de contrôle "^[", le reste des données de couleur reste, par exemple, "33m". L'inclusion du code de couleur et de "m" fait l'affaire. Je suis perplexe avec s/ \x1B //g ne fonctionne pas car \x1B [31m fonctionne certainement avec echo.

45voto

grebulon Points 2302

Pour Mac OSX ou BSD, utilisez

./somescript | sed $'s,\x1b\\[[0-9;]*[a-zA-Z],,g'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X