Parcours
/
AWK
AWK
/
Exercices
/
Les bases
Les bases

Les bases

Exercice d'apprentissage

Introduction

Les fondamentaux

On appellera le langage AWK et l'exécutable qui interprète les programmes AWK awk ou gawk.

Motifs et actions

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.

Enregistrements et champs

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 :

  • découper l'entrée en enregistrements en utilisant le retour à la ligne comme « séparateur d'enregistrements », de sorte que chaque ligne est un enregistrement.
  • découper l'enregistrement en champs en utilisant les espaces comme « séparateur de champs », de sorte que chaque mot est un champ.

Motifs et actions, suite

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.

Motifs spéciaux

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.

Variables de champ

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.

Variables intégrées qui contrôlent l'analyse de l'entrée
  • 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.

Variables intégrées qui portent de l'information

Ces variables sont définies automatiquement par AWK pendant l'exécution du programme.

  • NF contient le nombre de champs de l'enregistrement courant.
    • Pour obtenir la valeur du dernier champ, utilise $NF.
  • NR contient le numéro de l'enregistrement courant.
    • Lorsque plusieurs fichiers d'entrée sont traités, 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.
    • Pour illustrer la différence entre NR et FNR, voici une expression AWK courante.
      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.

Notion de vérité

AWK utilise la même notion de vérité que le C.

  • Le nombre 0 est faux.
  • Tout autre nombre est vrai.

Comme AWK est un langage de traitement de texte, cette notion de vérité s'étend aux strings.

  • Une string vide "" est fausse.
  • Toute string non vide est vraie.

Commentaires

Les commentaires commencent par le caractère # et s'étendent jusqu'à la fin de la ligne.

Exemples

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

Instructions

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.

Note

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"
    }
    

1. Liste les noms d'utilisateur

Écris un programme awk qui affiche le premier champ séparé par des deux-points de chaque ligne du fichier passwd.

2. Affiche les numéros de ligne

É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.

3. Affiche les enregistrements dont le répertoire personnel n'est pas valide.

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.

4. Affiche les utilisateurs valides qui utilisent bash

Affiche les enregistrements pour lesquels le répertoire personnel est valide et le shell de connexion est bash.


Source

Conversation avec ChatGPT
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
AWK Exercism

Prêt à commencer Les bases ?

Inscris-toi sur Exercism pour apprendre et maîtriser AWK avec 3 concepts92 exercices, et un vrai mentorat humain, le tout gratuitement.