Comment supprimer les codes de couleur de la sortie standard et diriger vers le fichier et la sortie standard


14

J'ai un programme qui utilise printfavec certains tputmélangés et je voudrais diriger la sortie vers stdout ainsi qu'un fichier. Je préfère utiliser sedcar je ne veux pas de dépendances inutiles sur mon script. Voici ce que j'ai jusqu'à présent.

printf "\n$(tput setaf 6)| $(tput sgr0)$(tput setaf 7)Sourcing files...\033[m\n" | tee install.log

Le seul problème avec cela est que mon fichier journal obtient toute la sortie couleur en tant que telle ...

^[[36m| ^[(B^[[m^[[37mSourcing files...^[[m

Je voudrais juste avoir | Sourcing files...



@StephaneChazelas, j'essaie de ne pas utiliser les scripts Perl pour l'instant, et même les sedoptions ne semblent pas fonctionner.
iamnewton

Réponses:


12

Selon la suppression des couleurs de la sortie , votre commande doit être:

printf "\n$(tput setaf 6)| $(tput sgr0)$(tput setaf 7)Sourcing files...\033[m\n" |\
sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" |tee install.log
w/o "-r"
sed "s/\x1B\[\([0-9]\{1,2\}\(;[0-9]\{1,2\}\)\?\)\?[mGK]//g"

Pour des raisons de commodité, vous pouvez également créer un alias dans /etc/profile

alias stripcolors='sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g"'
w/o '-r'
alias stripcolors='sed "s/\x1B\[\([0-9]\{1,2\}\(;[0-9]\{1,2\}\)\?\)\?[mGK]//g"'

[Éditer]

Avec la sortie donnée, vous pouvez vérifier cela par vous-même:

#!/usr/bin/perl

while ($line=<DATA>) {
    $line =~ s/^[0-9a-f]+: //;
    while ($line =~ s/([0-9a-f]{2})(?=[0-9a-f]{2}| )//) {
      print chr(hex($1));
    }
}
__DATA__
0000000: 1b5b 316d 1b5b 3333 6de2 9aa0 2020 5761 .[1m.[33m... Wa
0000010: 726e 696e 673a 201b 2842 1b5b 6d4e 6f20 rning: .(B.[mNo
0000020: 2f55 7365 7273 2f61 7077 2f2e 6261 7368 /Users/apw/.bash
0000030: 2066 6f75 6e64 2e21 0a found.!.

Le résultat:

$ perl checkerbunny|xxd
0000000: 1b5b 316d 1b5b 3333 6de2 9aa0 2020 5761  .[1m.[33m...  Wa
0000010: 726e 696e 673a 201b 2842 1b5b 6d4e 6f20  rning: .(B.[mNo 
0000020: 2f55 7365 7273 2f61 7077 2f2e 6261 7368  /Users/apw/.bash
0000030: 2066 6f75 6e64 2e21 0a                    found.!.

$ perl checkerbunny|stripcolors|xxd
0000000: e29a a020 2057 6172 6e69 6e67 3a20 1b28  ...  Warning: .(
0000010: 424e 6f20 2f55 7365 7273 2f61 7077 2f2e  BNo /Users/apw/.
0000020: 6261 7368 2066 6f75 6e64 2e21 0a         bash found.!.

1
l' -rindicateur ne semble pas fonctionner sur Mac BSD, j'ai donc essayé d'utiliser -Esemble être le plus similaire et il est toujours en sortie dans le fichier journal en tant que tel ... ^[36m| ^[(B^[[m^[[37mSourcing files...^[[m Il revient également comme | ^[(BSourcing files...sur ma boîte Linux.
iamnewton

veuillez nous montrer la sortie de votre cmd d'impression avec |xxdet votre TERMenv. var.

TERM=> xterm. 0000000: 1b5b 316d 1b5b 3333 6de2 9aa0 2020 5761 .[1m.[33m... Wa 0000010: 726e 696e 673a 201b 2842 1b5b 6d4e 6f20 rning: .(B.[mNo 0000020: 2f55 7365 7273 2f61 7077 2f2e 6261 7368 /Users/apw/.bash 0000030: 2066 6f75 6e64 2e21 0a found.!.
iamnewton

1
cela me donne toujours les mêmes résultats, sauf que je dois changer la stripcolorsfonction car Mac OS X ne comprend pas l' -roption de la sedcommande. Je suppose que vous êtes sur une sorte de distribution Linux?
iamnewton

3
Malheureusement, cela ne fonctionne pas sur OS X.
Jorge Bucaran
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.