public : débutantes & débutants (comme moi)
Bonjour les curieuses et les curieux,
awk ?Il permet de traiter par lignes les fichiers dits plats. Il doit son nom à celui de ses créateurs :
- Alfred A[/size]ho,
- Peter Weinberger,
- Brian K[/size]ernighan.
Outre rechercher, il autorise le remplacement et les modifications même complexes (plus d'infos : https://fr.wikipedia.org/wiki/Awk).
Ce petit article se limitera, cantonnera cependant à lever un voile pudique sur la recherche.
awk associé à l'action { print } ou { printf }, et bien, c'est terrrrrrible.
Amusons-nous !Le fichier utilisé pour cet article s'intitule woof-installed-packages (dans Toutou Slaxen 6.0 on le trouve dans /root/.packages/) et contient tous les paquets de la distribution. Celui des paquets installés par l'utilisateur que vous êtes et que je suis est stockés dans le fichier user-installed-packages en suivant le même chemin.
Ceci étant dit, ouvrons un terminal et tapotons joyeusement ceci :
awk '{print}' /root/.packages/woof-installed-packagesEt bien oui, elle équivaut à :
cat /root/.packages/woof-installed-packages
Cette première commande consistait à vous montrer ce qu'il se passait a minima.
En lisant avec un peu d'attention la sortie de la commande ci-dessus, on remarque que les données sont séparées par le caractère "|" : il s'agit du séparateur de champs.
Le séparateur découpe une ligne (un enregistrement) en plusieurs champs.
Ici, le premier champs précise le nom et la version du paquet,
le deuxième le nom,
le troisième la version,
la quatrième ? j'en sais fichtre rien,
le cinquième sa catégorie,
le sixième sa taille une fois installé,
etc.
awk peut utiliser le séparateur quelqu'il soit pour restituer les informations demandées, ou champs.
Pour cela, enrichissons notre vocabulaire avec l'option -F et les informations (champs) que nous souhaitons observer :
awk -F '|' '{print $2,$3,$6}' /root/.packages/woof-installed-packagesNous obtenons le nom ($2), la version ($3) et la taille du paquet installé ($6).
Nous aurions pu demander un ordre différent. Pour cela, il suffit de placer les champs dans l'ordre voulu.
Par exemple, afficher la taille en 1er, puis le nom et enfin la version, soit
'printf $6, $2, $3'.
awk permet d'aller encore plus loin.
On y va ?Allons-y.Si on veut connaître des choses sur les seuls paquets contenant le mot Abiword, il faut tout lire : la barbe.
Réjouissons-nous !
La liste retournée peut être réduite grâce à un filtre défini dans la ligne de commande.
Nous voudrions lister que ce qui contient Abiword ou abiword.
Nous saisirons gaiement ceci :
awk -F'|' '/Abiword|abiword/ {print $1 $3 $6}' /root/.packages/woof-installed-packagesLa chaîne recherchée est placée entre deux "/". Ici, comme on recherche Abiword et abiword, on insère "|" entre ces deux termes pour signifier l'un
OU l'autre.
C'est joli, n'est-ce pas ?
Et bien, on peut faire encore plus joli, mais au lieu d'utiliser print, il faudra recourir à
printf qui accepte les séquences d'échappement.
Voyons ça de plus près.
Nous voudrions préciser le nom de chaque champs précède sa valeur.
Pour ce faire, nous entrerons dans la clairière ???, euh plutôt dans le terminal :
awk -F '|' '/Abiword|abiword/ {printf "Nom : %s\t\tVersion : %s\t\tTaille : %s\n",$2,$3,$6}' /root/.packages/woof-installed-packagesoù chaque
%s correspond à un champs défini avant la parenthèse fermante. Ainsi, le 1er %s correspond à $2, etc. ;
chaque
\t insère une tabulation ;
et
\n un saut de ligne.
C'est à peu près bien, mais peut encore mieux faire...
Essayons ceci :
awk -F '|' '/Abiword|abiword/ {printf "\nNom :\t\t%20s\nVersion :\t%20s\nTaille :\t%20s\n\n",$2,$3,$6}' /root/.packages/woof-installed-packagesPas maaaaaaaaaaaaaal, non ? (j'avoue, il en faut peu pour m'impressionner).
Ne revenons pas sur les \n et \t et %s.
Mais que signifie
%20s.
printf est averti que l'on veut que la colonne mesure 20 caractères de large et que la chaîne de caractères soit alignée à droite.
Pour un alignement à gauche, il suffit de faire précéder la valeur d'un signe "-", soit
%-20s, par exemple.
Essayez.
Deuxième jeuImaginons que vous ayez un fichier texte avec les n° de téléphone de vos amies et amis, parents, percepteur, etc.
Ce fichier, malgré tous vos efforts consentis et déployés, est un peu foutoir.
Pour faire simple, tous les n° ont été saisis sans espace (par ex. : 0123456789) et sont suivis du prénom (et nom quelquefois) de leur titulaire.
Et vous voudriez peut-être pouvoir les lire comme ceci :
La syntaxe s'enrichit encore, mais rassurez-vous rien de méchant si on l'explique.
Pour arriver au résultat ci-dessus, pianotons, pianotons :
echo "0612345678 Toto Momo" | awk 'BEGIN {FIELDWIDTHS= "2 2 2 2 2 15"; print " Num_tél Prénom (Nom)"} {print $1, $2, $3, $4, $5, $6}'Dans ma liste (qui en fait se résume à un enregistrement transmis via un paill-pe), les infos sont séparées par un espace d'où '-F" "'.
BEGIN indique qu'il y a quelque chose à faire une seule fois avant de retourner les données.
FIELDWIDTHS découpe un enregistrement en champs, ici 6 champs au total, sans se soucier du séparateur.
Dans l'exemple ci-avant, chaque champs contient 2 caractères, sauf le dernier qui en compte arbitrairement 15.
Si les données à afficher sont inférieures ou égales à 15, elles seront indemnes, sinon elles seront tronquées et les caractères au-delà du 15ème seront ignorés.
Après 'print "', j'ai ajouté des noms de colonnes.
Les espaces avant $2 jusqu'à $6 permettent d'insérer un espace entre chaque champs.
Pour avoir le Prénom (Nom) dans la 1ère colonne, placez $6 avant $1 (et intervertissez les noms de colonnes ;) ).
On peut s'amuser de la même manière avec des n° de SS par exemple.
Une immatriculation répond à :
- 1 caractère pour le sexe ;
- 2 caractères pour l'année de naissance ;
- 2 autres pour le mois ;
- 5 autres pour le code INSEE de la commune de naissance ;
- 3 autres pour le n° d'acte dans le registre d'état-civil ;
- et les 2 derniers comme clé de contrôle.
Sachant cela, on peut afficher quelque chose de plus lisible.
Par exemple :
echo 122334444455566 | awk 'BEGIN {FIELDWIDTHS= "1 2 2 5 3 2"} {print $1, $2, $3, $4, $5, $6}'S'il y a un séparateur dans la chaîne source, il suffira d'ajouter '-F"séparateur"' à la suite d'awk.
Votre navigateur et les traducteurs en ligne sont vos amis.
Cherchez plus d'infos, si vous en avez envie.
Liens :Pour awk :La page de manuel en pas français : https://www.man7.org/linux/man-pages/man1/awk.1p.html
Un manuel en français : https://linux-man.fr/index.php/2020/08/08/commande-awk/
Un article de lea-linux.org en français : https://lea-linux.org/documentations/GAWK
https://fr.unixlinux.online/mx/1001036711.html
https://fr.linux-terminal.com/?p=626
https://www.it-connect.fr/tuto-commande-awk-linux/
Pour printf :La page de manuel en français : https://fr.manpages.org/printf
Une autre page de manuel en français : https://www.man-linux-magique.net/man1/printf.html
https://linuxsimply.com/printf-command-in-linux/
https://app.studyraid.com/fr/read/17582/628997/formatage-de-la-sortie