Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Expressions régulières
  3. fo, une commande de formatage
Extrait - Expressions régulières Syntaxe et mise en œuvre (avec exercices et corrigés) (2e édition)
Extraits du livre
Expressions régulières Syntaxe et mise en œuvre (avec exercices et corrigés) (2e édition) Revenir à la page d'achat du livre

fo, une commande de formatage

Description 

La commande fo (format output) est une commande que j’ai écrite en C il y a quelques années, afin de gagner un peu de temps lors de l’analyse de certaines données. Je suis parti de la constatation que la lecture de données correctement alignées en colonnes est plus rapide que la lecture de données mal alignées. L’idée derrière cette commande est d’aligner verticalement des données en sélectionnant les champs de chaque ligne grâce à une expression régulière, et de les afficher selon un format dans lequel on spécifie une largeur minimale pour chaque champ.

Elle est disponible sur GitHub et peut être installée de la façon suivante :

$ git clone https://github.com/mbornet-hl/fo  
$ cd fo/src; make 

Le binaire produit est le fichier fo dans le répertoire courant. Il peut être copié dans un répertoire dont le nom figure dans la variable PATH pour une plus grande facilité d’utilisation.

Les expressions régulières 

Les expressions régulières reconnues par la commande fo sont celles des fonctions regcomp() et regexec(), à savoir les expressions régulières étendues. La capture des valeurs des champs est effectuée en plaçant les sous-expressions spécifiant les champs entre parenthèses. L’affichage des valeurs est réalisé grâce à des appels à la fonction printf() à laquelle on passe deux informations :

  • la largeur minimale des champs, en nombre de caractères ;

  • le cadrage (à gauche ou à droite, selon que la largeur spécifiée est négative ou positive, de la même façon qu’avec printf()), les valeurs des champs étant toujours de type « chaîne de caractères ».

Il n’est pas nécessaire de décrire ici les expressions régulières utilisées par la commande fo, car elles sont identiques à celles utilisées dans la commande egrep (ou grep -E) qui ont déjà été décrites précédemment.

Cette commande ne sait actuellement traiter qu’une seule expression régulière, spécifiée sur la ligne de commande, mais il est prévu que, dans un avenir proche, elle puisse en traiter plusieurs qui pourront être...

Exemple d’utilisation 

Pour illustrer l’utilisation de cette commande, nous allons prendre le fichier /etc/passwd en exemple.

La commande sed suivante va nous permettre d’afficher les lignes depuis le début du fichier jusqu’à la première (et en principe la seule) ligne contenant le nom d’utilisateur uuid :

$ sed -n '1,/^uuid/p' /etc/passwd 

Le résultat est le suivant :

images/18RI01N.png

et on peut admettre qu’il n’est pas particulièrement lisible.

Le formatage avec la commande suivante :

$ sed -n '1,/^uuid/p' /etc/passwd | fo '^([^:]+):([^:]+):
([0-9]+):([0-9]+):([^:]*):([^:]*):([^:]*)' -20,1,5,5,-34,-30,0 

donne le résultat :

images/18RI02N.png

qui est tout de même plus lisible. L’œil peut balayer les colonnes de façon quasi instantanée, et le cerveau peut très rapidement comparer les valeurs des chaînes, leur longueur, et repérer les différences bien plus facilement que dans le cas où les données ne sont pas alignées ni séparées les unes des autres par des espaces.

Le fonctionnement de cette commande est le suivant : le premier argument passé est l’expression régulière :

'^([^:]+):([^:]+):([0-9]+):([0-9]+):([^:]*):([^:]*):([^:]*)' 

qui permet de récupérer la valeur des champs de chaque ligne de /etc/passwd. Cette expression...