web-dev-qa-db-fra.com

Mise en surbrillance des couleurs basée sur regex dans un shell

J'aimerais savoir si je peux colorier la sortie d'une commande Shell qui correspond à certaines chaînes. 

Par exemple, si je lance 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. * Soient surlignées en rouge.

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

EDIT: Je devrais probablement mentionner que, idéalement, j'aimerais activer cette fonctionnalité globalement via une option de "profil" dans mon .bashrc.

39
Joel

Si vous voulez l'activer globalement, vous aurez besoin d'une fonctionnalité de terminal, et non d'un processus dans lequel vous dirigez la sortie, car un tuyau perturberait une commande (deux problèmes mise en mémoire tampon, et que certaines commandes se comportent différemment lors de la sortie vers un terminal).

Je ne connais aucun terminal «classique» doté de cette fonctionnalité. Cela se fait facilement dans Emacs, dans un tampon term: configurez font-lock-keywords pour term-mode.

Cependant, vous devriez bien réfléchir si vous voulez vraiment cette fonctionnalité tout le temps. Que se passe-t-il si la commande a ses propres couleurs (par exemple, grep --color, ls --color)? Peut-être serait-il préférable de définir un alias court pour une commande colorizer et d'exécuter myCommand 2>&1|c lorsque vous souhaitez coloriser la sortie de myCommand. Vous pouvez également aliaser des commandes spécifiques à toujours coloriser .

Notez que le statut de retour d'un pipeline correspond à sa commande last. Par conséquent, si vous exécutez myCommand | c, vous obtenez le statut de c et non de myCommand. Voici un wrapper bash qui évite ce problème, que vous pouvez utiliser comme w myCommand:

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

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

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

ou

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

Ceci va "correspondre à votre motif ou à la fin de ligne de chaque ligne. Seul le motif est mis en surbrillance ..."

42
E.Z.

Vous pouvez utiliser des programmes tels que:

Vous pouvez faire quelque chose comme ça, mais les commandes ne verront pas un tty (certains refuseront de courir ou de se comporter différemment ou feront des choses bizarres):

exec > >(histring -fEi error)    # Bash
25
Dennis Williamson

Vous pouvez essayer (peut-être besoin d'un peu plus d'échappatoire):

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

Essayer

tail -f yourfile.log | egrep --color 'DEBUG|'

où DEBUG est le texte que vous voulez surligner.

1
userM1433372

Vous pouvez utiliser la commande hl disponible sur github:
git clone http://github.com/mbornet-hl/hl

Ensuite :
myCommand | hl -r '^ ERROR. *'

Vous pouvez utiliser le fichier de configuration $ HOME/.hl.cfg pour simplifier la ligne de commande.
hl est écrit en C (la source est disponible) . Vous pouvez utiliser jusqu'à 42 couleurs de texte différentes.

1
Bush

Vous pourriez probablement l'activer pour des commandes spécifiques utilisant des alias et des fonctions Shell définies par l'utilisateur sans trop de problèmes. Si vos erreurs de coloration, je suppose que vous voulez traiter stderr. Puisque stderr est en mode tampon, vous voudrez probablement le mettre en tampon de ligne en l'envoyant via un fifo. 

1
dietbuddha

Utilisez awk.

 COLORIZE_AWK_COMMAND='{ print $0 }'
 if [ -n "$COLORIZE" ]; then
     COLORIZE_AWK_COMMAND='
     /pattern1/ { printf "\033[1;30m" }
     /pattern2/ { printf "\033[1;31m" }
     // { print $0 "\033[0m"; }'
 fi

alors plus tard, vous pouvez diriger votre sortie

... | awk "$COLORIZE_AWK_COMMAND"

printf est utilisé dans les motifs pour ne pas imprimer de nouvelle ligne, mais simplement définir la couleur.

0
skensell