47 votes

Mise en évidence de la couleur de la sortie basée sur une expression rationnelle dans le shell

J'aimerais savoir si je peux mettre en couleur la sortie d'une commande shell qui correspond à certaines chaînes de caractères.

Par exemple, si j'exécute maCommande, avec le résultat ci-dessous :

> myCommand
DEBUG foo bar
INFO bla bla
ERROR yak yak

Je voudrais que toutes les lignes correspondant à ^ERROR \s. * à mettre en évidence en rouge.

De même, j'aimerais que la même mise en évidence soit appliquée à la sortie de grep, less etc...

EDIT : Je devrais probablement mentionner que, dans l'idéal, j'aimerais activer cette fonctionnalité de manière globale via une option 'profil' dans mon .bashrc.

53voto

Mr.E. Points 2076

Il y a une réponse dans superuser.com :

your-command | grep -E --color 'pattern|$'

o

your-command | grep --color 'pattern\|$'

Cela permettra "correspond à votre modèle ou à la fin de la ligne sur chaque ligne. Seul le motif est mis en évidence..."

0 votes

Vérifiez le grep en particulier la documentation relative à l'option GREP_COLORS variable d'environnement.

2 votes

Voici une version de cette fonction que vous pouvez ajouter à .bashrc/.bash_profile (remplacez --- par des sauts de ligne !): # Mettre en évidence toutes les occurrences d'une certaine chaîne dans le texte envoyé à cette fonction. ---# Exemple d'utilisation : echo 'hello world' | hilight world ---function highlight { grep -E --color "$1|\$" ; }

28voto

Dennis Williamson Points 105818

Vous pouvez utiliser des programmes tels que :

Vous pouvez faire quelque chose comme ça, mais les commandes ne verront pas de tty (certaines refuseront de s'exécuter ou se comporteront différemment ou feront des choses bizarres) :

exec > >(histring -fEi error)    # Bash

14voto

Benoit Points 35553

Vous pouvez essayer (il faut peut-être un peu plus d'échappatoires) :

BLUE="$(tput setaf 4)"
BLACK="$(tput sgr0)"
command | sed "s/^ERROR /${BLUE}ERROR ${BLACK}/g"

0 votes

Pour mettre en évidence les erreurs et les avertissements de gcc à partir de make, enregistrez ce qui suit en tant que ~/bin/errmake : make $@ 2>&1 | sed -e "s/error:/$(tput setab 1 ; tput bold)error:$(tput sgr0)/g" -e "s/warning:/$(tput setab 4 ; tput bold)warning:$(tput sgr0)/g"

14voto

Gilles Points 37537

Si vous voulez activer cette fonctionnalité de manière globale, vous devez utiliser un terminal, et non un processus dans lequel vous envoyez la sortie par pipe, car un pipe perturberait certaines commandes (deux problèmes : stdout et stderr apparaîtraient dans le désordre et dans la mémoire tampon, et certaines commandes se comportent différemment lors de la sortie sur un terminal).

Je ne connais pas de terminal "conventionnel" avec cette fonctionnalité. C'est facilement réalisable dans Emacs, dans un fichier term tampon : configurer font-lock-keywords para term-mode .

Cependant, vous devez bien réfléchir si vous voulez vraiment cette fonctionnalité en permanence. Que faire si la commande a ses propres couleurs (par ex. grep --color , ls --color ) ? Il serait peut-être plus judicieux de définir un alias court pour une fonction commande du coloriste et exécuter myCommand 2>&1|c quand vous voulez coloriser myCommand de la sortie. Vous pouvez également alias de certaines commandes spécifiques de always-colorize .

Notez que le statut de retour d'un pipeline est son dernier donc si vous exécutez myCommand | c vous obtiendrez le statut de c no myCommand . Voici un wrapper bash qui évite ce problème, que vous pouvez utiliser comme w myCommand :

w () {
  "$@" | c
  return $PIPESTATUS[0]
}

0 votes

Notez que w est un utilitaire sous Linux similaire à who .

1voto

dietbuddha Points 4031

Vous pourriez probablement l'activer pour des commandes spécifiques en utilisant des alias et des fonctions shell définies par l'utilisateur sans trop de problèmes. Si vous coloriez les erreurs, je suppose que vous voulez traiter stderr. Puisque stderr n'est pas bufferisé, vous voudrez probablement le bufferiser en ligne en l'envoyant à travers un fifo.

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