On appellera le langage AWK et l'exécutable qui interprète les programmes AWK awk ou gawk.
Un programme AWK est composé de paires motif-action
pattern1 { action1 }
pattern2 { action2 }
...
Un motif peut être une expression régulière à comparer à l'entrée. Il peut aussi s'agir de n'importe quelle expression qui produit une valeur vraie ou fausse.
Une action est une ou plusieurs commandes AWK. Les accolades qui l'entourent sont obligatoires.
Si le résultat du motif est vrai, alors l'action correspondante est évaluée.
AWK analyse l'entrée comme une série d'enregistrements. Chaque enregistrement est découpé en zéro ou plusieurs champs.
Le comportement par défaut est le suivant :
On peut omettre le motif, auquel cas l'action est évaluée pour chaque enregistrement en entrée.
On peut omettre l'action, auquel cas l'action par défaut consiste à afficher l'enregistrement courant.
Deux motifs spéciaux sont souvent utilisés.
BEGIN évalue l'action associée avant que la moindre entrée ne soit lue.END évalue l'action associée une fois toute l'entrée lue.On désigne les champs par $1, $2, $3, etc.
L'enregistrement courant est $0.
Voici quelques autres variables intégrées fréquemment utilisées.
RS est le séparateur d'enregistrements en entrée.
Comme mentionné, sa valeur par défaut est le retour à la ligne.FS est le séparateur de champs en entrée.Ces variables sont souvent définies dans le bloc d'action BEGIN.
Ces variables sont définies automatiquement par AWK pendant l'exécution du programme.
NF contient le nombre de champs de l'enregistrement courant.
$NF.NR contient le numéro de l'enregistrement courant.
NR contient le nombre total d'enregistrements traités jusqu'ici.FNR contient le numéro de l'enregistrement courant dans le fichier d'entrée courant.
NR == FNR {action}
Cela signifie « si le numéro d'enregistrement cumulé est égal au numéro d'enregistrement du fichier courant ».
Ce ne peut être vrai que pour les enregistrements du premier fichier d'entrée.AWK utilise la même notion de vérité que le C.
0 est faux.Comme AWK est un langage de traitement de texte, cette notion de vérité s'étend aux strings.
"" est fausse.Les commentaires commencent par le caractère # et s'étendent jusqu'à la fin de la ligne.
Sur les systèmes de type Unix, /etc/passwd contient des informations sur les utilisateurs.
Chaque utilisateur est décrit sur une ligne distincte, les champs étant séparés par des deux-points.
Pour lister les noms d'utilisateur :
awk '
BEGIN { FS = ":" }
{ print $1 }
' /etc/passwd
Remarque que l'action {print $1} n'a pas de motif, elle est donc exécutée pour chaque enregistrement.
Si on veut limiter la sortie aux seuls utilisateurs qui utilisent bash comme shell de connexion, on peut faire :
awk '
BEGIN { FS = ":" }
$7 == "/bin/bash" { print $1 }
' /etc/passwd
Il était une fois une ville animée appelée Cyberspace. Cyberspace était une métropole numérique, où des millions d'habitants se connectaient et se déconnectaient chaque jour. Pour garder la trace de tous ces utilisateurs, Cyberspace disposait d'un fichier spécial appelé /etc/passwd.
Le fichier /etc/passwd était comme un annuaire téléphonique pour la ville. Il listait chaque utilisateur possédant un compte sur le système, ainsi que quelques informations importantes sur chacun d'eux :
| n | champ |
|---|---|
| 1 | nom d'utilisateur |
| 2 | mot de passe (« x » indique que le mot de passe réel est stocké ailleurs, pour des raisons de sécurité) |
| 3 | UID, un identifiant utilisateur numérique unique |
| 4 | GID, un identifiant de groupe numérique unique (généralement identique à l'UID) |
| 5 | infos utilisateur (généralement le nom complet de l'utilisateur, mais peut contenir d'autres informations) |
| 6 | répertoire personnel |
| 7 | shell de connexion |
Les champs sont séparés par le caractère deux-points. Voici une entrée typique :
glennj:x:1010:1010:Glenn Jackman:/home/glennj:/usr/local/bin/fish
Le fichier était géré par une équipe d'administrateurs système, chargés de créer de nouveaux comptes, de mettre à jour les comptes existants et de supprimer les anciens comptes. Les administrateurs système étaient les gardiens de Cyberspace, veillant à ce que seuls les utilisateurs autorisés puissent accéder au système.
Un jour, un nouvel administrateur système nommé Alex fut recruté pour rejoindre l'équipe. Alex, enthousiaste à l'idée de prendre ce poste, a rapidement appris les rouages du fichier /etc/passwd. Alex a appris à ajouter de nouveaux utilisateurs au système, à mettre à jour les informations des utilisateurs et à supprimer les anciens comptes.
Alors qu'Alex travaillait sur le fichier /etc/passwd, quelque chose d'étrange a été remarqué. Certains utilisateurs avaient des répertoires personnels étranges ou inhabituels. Pour certains, le répertoire personnel était défini sur /dev/null, tandis que pour d'autres, il pointait vers des chemins étranges qui n'existaient pas.
Alex a compris que ces utilisateurs n'étaient pas de vraies personnes, mais plutôt des faux comptes créés par des pirates informatiques. Les pirates avaient trouvé un moyen d'exploiter une faille du système et avaient créé ces faux comptes pour accéder à Cyberspace.
Alex savait qu'il fallait agir. Alex a utilisé awk pour analyser le fichier /etc/passwd et a écrit un script pour identifier tous les faux comptes. Alex a ensuite travaillé avec le reste de l'équipe pour supprimer ces comptes et pour corriger la faille qui avait permis aux pirates de les créer au départ.
Grâce à l'utilisation d'awk par Alex, l'équipe a pu identifier et supprimer les faux comptes, et faire de Cyberspace un endroit plus sûr pour tout le monde. Les administrateurs système ont continué à gérer le fichier /etc/passwd, en le maintenant à jour et sécurisé, et en veillant à ce que seuls les utilisateurs autorisés puissent accéder au système.
Maintenant, c'est à ton tour d'être un administrateur système comme Alex.
Voici quelques éléments de syntaxe AWK supplémentaires dont tu auras besoin pour résoudre cet exercice.
Les opérateurs booléens sont similaires à ceux d'autres langages :
| opération | exemple |
|---|---|
| ET | expr1 && expr2 |
| OU | expr1 || expr2 |
| PAS | ! expr |
Appeler une fonction utilise une syntaxe familière :
function greet(name) {
print "Hello", name
}
BEGIN {
greet("Mary") # prints "Hello Mary"
}
Écris un programme awk qui affiche le premier champ séparé par des deux-points de chaque ligne du fichier passwd.
Écris une commande awk qui affiche le numéro de ligne de chaque enregistrement du fichier d'entrée. N'affiche que le numéro de ligne, aucune autre information.
Dans Cyberspace, un répertoire personnel « valide » commence par /home ou /root.
Affiche les enregistrements du fichier d'entrée dont le répertoire personnel n'est pas valide.
Affiche les enregistrements pour lesquels le répertoire personnel est valide et le shell de connexion est bash.
Inscris-toi sur Exercism pour apprendre et maîtriser AWK avec 3 concepts92 exercices, et un vrai mentorat humain, le tout gratuitement.