Utilisation de sed pour colorer la sortie d'une commande sur solaris

29

J'ai un script ksh qui doit fonctionner à la fois sur Linux et Solaris. J'essaie de colorer la sortie de commandes spécifiques. Il fonctionne sur Linux (spécifiquement RHEL6), mais pas sur Solaris (SunOS 5.10).

Commande sous linux (la sortie "test" est correctement colorée en rouge):

[amartin@linuxbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
test

Commande sur solaris (la sortie "test" n'est pas colorée):

[amartin@sunbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
x1B[31mtestx1B[0m

Existe-t-il un moyen de créer cette commande de telle sorte que la sortie soit rouge, sans les codes bruts dans la sortie? Je ne peux pas changer la commande 'echo' car c'est juste un complément pour la commande que j'exécute réellement.

acm
la source

Réponses:

35

\xNN est une séquence d'échappement dans GNU sed, mais elle n'est pas standard, et en particulier elle n'est pas disponible sur Solaris.

Vous pouvez inclure un caractère d'échappement littéral dans votre script, mais cela rendrait la lecture et l'édition difficiles.

Vous pouvez utiliser printfpour générer un caractère d'échappement. Il comprend les échappements octaux, pas hexadécimaux.

esc=$(printf '\033')
echo "test" | sed "s,.*,${esc}[31m&${esc}[0m,"

Vous pouvez appeler tputpour générer le texte de remplacement dans l'appel à sed. Cette commande recherche les séquences d'échappement dans la base de données terminfo . En théorie, l'utilisation tputrend votre script plus portable, mais en pratique, il est peu probable que vous rencontriez un terminal qui n'utilise pas les codes d'échappement ANSI .

echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"
Gilles 'SO- arrête d'être méchant'
la source
cela fonctionne très bien pour coloriser sur un cat |sedtrop thx!
Aquarius Power
8

Ce serait plus facile à utiliser tput

tput setaf 1; somecommand; tput sgr0

ou

tput setaf 1
somecommand
tput sgr0

Cela met le premier plan en rouge, exécute somecommandqui affiche ensuite la sortie en rouge puis efface la séquence de couleurs. Cela fonctionne au moins avec bash, zshet ksh.

Voir tmux(1)et terminfo(5)pour plus d'informations sur ce que vous pouvez faire avec tput.

bahamat
la source
Merci pour la réponse. Comme je l'ai dit plus tôt, je ne peux pas changer la commande echo. 'echo' est juste un substitut au processus que j'appelle, que je ne peux pas changer. Est-il possible d'utiliser sed avec tput d'une manière ou d'une autre? De plus, lorsque j'exécute cette commande sur sunOS 5.10, je ne vois aucune couleur.
acm
Je l'ai mis à jour pour le séparer en commandes distinctes.
bahamat
C'est mieux que mon implémentation actuelle car il n'imprime pas de codes ascii bruts sur solaris. Cependant (pour une raison quelconque), il ne colore pas la sortie de 'somecommand' sur solaris. Il le fait sur Linux. J'ai accepté la réponse @Gilles, qui fait les deux. Merci.
acm
0

Certains terminaux (comme bash dans iterm pour moi) vous permettent d'appuyer sur les touches "ctrl-v" suivies de "ctrl + [" et cela mettra le caractère d'échappement littéral dans la chaîne d'entrée. Si cela fonctionne, vous verrez probablement les caractères "^ [" imprimés à l'écran, mais si vous déplacez votre curseur autour de lui, il le traitera comme un seul caractère car il est vraiment dans les coulisses.

Pour comprendre ce qui se passe (et pour tester si cela est possible), vous pouvez taper ctrl + v suivi de ctrl + i. Vous devez voir que le caractère de tabulation a été inséré dans votre chaîne d'invite. Il y a un historique CS pour expliquer pourquoi c'est le cas: mais il s'avère que le clavier vraiment ancien avait ctrl + I câblé pour envoyer le caractère de tabulation; et la touche de tabulation envoie également le même signal électrique.

Pour cette raison héritée, bash pour de nombreux terminaux interprète toujours certains codes Ctrl pour mapper à ces mêmes caractères.

Ctrl + I correspond au caractère de tabulation, et ctrl + [correspond au caractère d'échappement ascii.

Alexander Bird
la source