hl, une commande de colorisation
Description
La commande hl (pour HighLight : mettre en lumière, mettre en évidence) est une commande que j’ai écrite en 2015 dans le but initial de me rendre la lecture de fichiers de logs plus facile et plus rapide. Après avoir cherché sans succès la commande dont j’avais besoin, j’ai décidé de la créer en utilisant les fonctions regcomp() et regexec() que nous avons vues précédemment.
Le but de cette commande est de coloriser des chaînes de caractères correspondant à des expressions régulières.
Elle présente l’avantage de mettre en évidence de façon très visible les chaînes correspondant à une expression régulière, et donc de tester très rapidement sa compréhension d’expressions régulières potentiellement très compliquées. Une option d’affichage des expressions régulières telles qu’elles sont reçues par le programme peut être utile pour garantir que les expressions passées au programme par les shells n’ont pas subi de modification non désirée. Lors de l’apprentissage des expressions régulières, ce programme est un outil pédagogique amusant et efficace.
Les fichiers sources de cette commande sont disponibles en annexe, et dans une version...
Principe de fonctionnement
La commande hl lit les données à coloriser sur l’entrée standard et écrit le résultat éventuellement colorisé sur la sortie standard.
Les règles de colorisation sont données par les options spécifiées en ligne de commande.
Sept couleurs sont disponibles pour la colorisation (en comptant le blanc comme une couleur) :
-
le rouge (red),
-
le vert (green),
-
le jaune (yellow),
-
le bleu (blue),
-
le magenta (magenta),
-
le cyan (cyan),
-
le blanc (white).
Ces sept couleurs sont disponibles en mode normal et en mode inversé (reverse video), avec trois niveaux d’intensité ou en mode souligné ou clignotant.
Chaque couleur peut être associée à une expression régulière et une seule.
Lorsqu’une chaîne de caractères, dans les données à traiter, correspond à plusieurs expressions régulières spécifiées, l’ordre dans lequel ont été spécifiées les couleurs permet de déterminer la couleur de la chaîne, la priorité des options étant décroissante au fur et à mesure de leur spécification sur la ligne de commande.
Exemple 1
echo abababab | hl -r a -g ab
La commande hl précédente permet de colorer en priorité la lettre a en rouge, puis en vert les chaînes...
Description des options
1. Usage de la commande
Les nouvelles fonctionnalités n’étant pas abordées dans cette édition, l’usage présenté reste celui présenté à l’époque, à savoir celui de la version 1.27 :
hl: version 1.27
Usage: hl [-h|-eidD][-E][-rgybmcwRGYBMCW] regexp ...
-h : help
-v : version
-u : do not bufferize output on stdout
-e : extended regular expressions
-i : ignore case
-E : print on stderr
-r : red
-g : green
-y : yellow
-b : blue
-m : magenta
-c : cyan
-w : white
-R : red (reverse video)
-G : green (reverse video)
-Y : yellow (reverse video)
-B : blue (reverse video)
-M : magenta (reverse video)
-C : cyan (reverse video)
-W : white (reverse video)
-d : debug
-D : display regular expressions
2. Options de couleurs
Les options de couleurs sont les options -r, -g, -y, -b, -m, -c, et -w pour les couleurs en vidéo normale, et -R, -G, -Y, -B, -M, -C et -W pour les couleurs en vidéo inversée.
Chaque option de couleur permet la spécification, grâce à l’argument...
Exercices
1. Exercice 1
Comment coloriser la sortie de la commande d’affichage de calendrier (cal), de telle sorte que :
-
l’année soit en rouge,
-
les mois soient en magenta,
-
les jours de la semaine soient en bleu clair (cyan),
-
les jours du mois soient en bleu ?
Solution
Sur un système de langue anglaise, la commande sera la suivante :
cal 2015 | hl -e -r '[1-9][0-9]{3}' -m 'January|February|March|
April|May|June|July|August|September|October|November|December' -c
'Su|Mo|Tu|We|Th|Fr|Sa' -b '[0-9]'
Cette commande demande l’exécution de la commande cal pour l’année 2015 et redirige sa sortie vers la commande hl.
L’option -e indique que les expressions régulières seront des expressions régulières étendues.
L’option -r demande de coloriser en rouge les nombres de 4 chiffres décimaux ne commençant pas par 0 ([1-9][0-9]{3}).
L’option -m demande de coloriser en magenta les noms des mois de l’année, spécifiés en extension et séparés par le symbole | qui signifie OU (January|February|March|April|May|June|July|August|September|October|November|December).
L’option -c demande de coloriser en cyan les jours de la semaine, spécifiés en extension et séparés par le symbole | qui signifie OU (Su|Mo|Tu|We|Th|Fr|Sa).
L’option -b demande de coloriser en bleu les chiffres décimaux restant ([0-9]).
2. Exercice 2
Comment coloriser en vert, en utilisant les expressions régulières basiques, une adresse MAC, au format xx:xx:xx:xx:xx:xx, où chaque caractère x représente un chiffre hexadécimal ? On n’utilisera pas l’option permettant d’ignorer la casse des lettres.
Solution
echo "Adresse MAC : 50:46:5D:8B:26:16" | hl -i -g '[0-9a-fA-F][0-
9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F]
[0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]'
Chacun des cinq premiers groupes de deux chiffres hexadécimaux doit être suivi du caractère :, à l’exception du dernier groupe. Dans ces groupes, chaque chiffre hexadécimal doit être spécifié individuellement. L’expression [0-9a-fA-F] permet de spécifier un caractère hexadécimal...