web-dev-qa-db-fra.com

Commande pipable pour imprimer en couleur?

Je suis un peu nouveau dans le script bash, et je me demande s’il existe un programme ou une commande intégrée à diriger qui imprimera dans une couleur spécifiée? Ou y a-t-il un argument d'écho pour le faire?

Comme je pouvais faire:

echo Hi | commandhere -arguement blue

et il afficherait "Salut" dans la couleur bleue?

7
TenorB

Je ne connais aucun utilitaire d'impression couleur, mais vous pouvez le faire facilement avec une fonction Shell comme celle-ci:

# colorize stdin according to parameter passed (GREEN, CYAN, BLUE, YELLOW)
colorize(){
    GREEN="\033[0;32m"
    CYAN="\033[0;36m"
    GRAY="\033[0;37m"
    BLUE="\033[0;34m"
    YELLOW="\033[0;33m"
    NORMAL="\033[m"
    color=\$${1:-NORMAL}
    # activate color passed as argument
    echo -ne "`eval echo ${color}`"
    # read stdin (pipe) and print from it:
    cat
    # Note: if instead of reading from the pipe, you wanted to print
    # the additional parameters of the function, you could do:
    # shift; echo $*
    # back to normal (no color)
    echo -ne "${NORMAL}"
}
echo hi | colorize GREEN

Si vous voulez vérifier d'autres couleurs, jetez un oeil à cette liste . Vous pouvez ajouter un support pour n'importe quelle couleur à partir de là, en créant simplement une variable supplémentaire à cette fonction avec le nom et la valeur corrects.

10
elias

J'ai créé cette fonction que j'utilise dans les scripts bash.

 # Fonction permettant d'écho dans la couleur spécifiée 
 Echoincolor () {
 Case $ 1 sur 
 "Rouge") tput setaf 1 ;; 
 "Verte ") tput setaf 2 ;; 
" orange ") tput setaf 3 ;; 
" bleu ") tput setaf 4 ;; 
" violet ") tput setaf 5 ;; 
 "cyan") tput setaf 6 ;; 
 "grey" | "gris") tput setaf 7 ;; 
 "blanc") tput setaf 8 ;; 
 esac 
 echo "$ 2"; 
 tput sgr0 
} 

Ensuite, je l’appelle comme ceci echoincolor green "This text is in green!"

Alternativement, utilisez printf

 # Fonction permettant d’imprimer dans la couleur spécifiée 
 Colorprintf () {
 Case $ 1 sur 
 "Rouge") tput setaf 1 ;; 
 "Vert ") tput setaf 2 ;; 
" orange ") tput setaf 3 ;; 
" bleu ") tput setaf 4 ;; 
" violet ") tput setaf 5 ;; 
 "cyan") tput setaf 6 ;; 
 "grey" | "gris") tput setaf 7 ;; 
 "blanc") tput setaf 8 ;; 
 esac 
 printf "$ 2"; 
 tput Sgr0 
} 

Ensuite, appelez-le comme ceci colorprintf green "This text is in green!"

Remarque , echo fournit une nouvelle ligne, tandis que printf non.

3
HarlemSquirrel

Il y a une réponse beaucoup plus élégante que n'importe laquelle d'entre elles:

Sudo apt-get install grc

(qui installe également grcat)

Maintenant, exécutez:

echo "[SEVERE] Service is down" | grcat ~/conf.username

conf.myusername contient:

regexp=SEVERE
colours=on_red
count=more

(pour une raison quelconque, je ne trouve pas l'expression rationnelle correcte pour "tout entre guillemets")

1
Sridhar Sarnobat

J'utilise ce vieux script, nommé hilite.pl, tiré du Web, déjà avec la ligne "auteur inconnu"!

#!/usr/bin/Perl -w
### Usage: hilite <ansi command> <target string>
### Purpose: Will read text from standard input and perform specified highlighting
### command before displaying text to standard output.
### License: GNU GPL
# unknown author 

$|=1; # don't buffer i/o
$command = "$ARGV[0]";
$target = "$ARGV[1]";
$color = "\e[" . $command . "m";
$end = "\e[0m";

while(<STDIN>) {
    s/($target)/$color$1$end/;
    print $_;
}

Ensuite, je peux l'utiliser dans les pipes, pour "hilite" la sortie du journal ou d'autres choses, en utilisant regexp/PCRE:

 echo 'hello color world!!' | hilite.pl 34 "[Hh]el[^ ]*" | hilite.pl 43 .orld | hilite.pl 32 "\scolor\s"

Cela va peindre bonjour en bleu, la couleur en vert et le monde en fond jaune

Vous pouvez voir la liste de couleurs avec (vous pouvez développer l'expression bash jusqu'à {01..255} si vous le souhaitez):

for i in {01..10}  {30..49} {90..110}  ; do echo $i | hilite.pl $i $i ; done
1
higuita