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 ?

0voto

Carlos Soriano Points 501

Je suis tombé sur cette question/réponse en essayant de faire quelque chose de similaire à l'OP. J'ai trouvé d'autres ressources utiles et suis arrivé avec un script de journal basé sur ceux-ci. Je le poste ici au cas où il pourrait aider d'autres personnes.

L'examen des liens permet de comprendre une partie de la redirection, que je n'essaierai pas d'expliquer car je commence tout juste à la comprendre moi-même.

L'utilisation rendra la sortie colorisée sur la console, tout en supprimant les codes de couleur du texte envoyé au fichier journal. Il inclura également stderr dans le fichier journal pour toute commande qui ne fonctionne pas.

Edit : ajout d'une utilisation supplémentaire en bas pour montrer comment se connecter de différentes manières

#!/bin/bash
set -e
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

. $DIR/dev.conf
. $DIR/colors.cfg

filename=$(basename ${BASH_SOURCE[0]})
# remove extension
# filename=`echo $filename | grep -oP '.*?(?=\.)'`
filename=`echo $filename | awk -F\. '{print $1}'`
log=$DIR/logs/$filename-$target

if [ -f $log ]; then
  cp $log "$log.bak"
fi

exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>$log 2>&1

# log message
log(){
    local m="$@"
    echo -e "*** ${m} ***" >&3
    echo "=================================================================================" >&3
  local r="$@"
    echo "================================================================================="
    echo -e "*** $r ***" | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g"
    echo "================================================================================="
}

echo "=================================================================================" >&3
log "${Cyan}The ${Yellow}${COMPOSE_PROJECT_NAME} ${filename} ${Cyan}script has been executed${NC}"
log $(ls) #log $(<command>)

log "${Green}Apply tag to image $source with version $version${NC}"
# log $(exec docker tag $source $target 3>&2) #prints error only to console
# log $(docker tag $source $target 2>&1) #prints error to both but doesn't exit on fail
log $(docker tag $source $target 2>&1) && exit $? #prints error to both AND exits on fail
# docker tag $source $target 2>&1 | tee $log # prints gibberish to log
echo $? # prints 0 because log function was successful
log "${Purple}Push $target to acr${NC}"

Voici les autres liens qui ont aidé :

0voto

jimmax777 Points 11

J'ai utilisé perl car je dois le faire fréquemment sur de nombreux fichiers. Cela va parcourir tous les fichiers avec nom de fichier*.txt et supprimer tout formatage. Cela fonctionne pour mon cas d'utilisation et peut être utile pour quelqu'un d'autre aussi, alors j'ai juste pensé à le poster ici. Remplacez votre nom de fichier par nom de fichier*.txt ou vous pouvez mettre les noms de fichiers séparés par des espaces dans la variable FILENAME ci-dessous.

$ FILENAME=$(ls filename*.txt) ; for file in $(echo $FILENAME); do echo $file; cat $file | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > $file-new; mv $file-new $file; done

0voto

stu Points 2216

Ma contribution :

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

-8voto

spiderlama Points 166

Cela fonctionne pour moi :

./somescript | cat

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