Traiter du texte : grep, sed, awk, jq
Ce cours poursuit la partie Shell et outils du chapitre Fondations. Le cours Bash pour l'automatisation apprenait à écrire des scripts qui tiennent en production, et s'arrêtait souvent au même endroit : « au-delà de quelques milliers de lignes, passez à awk », « pour du JSON, prenez jq ». Celui-ci prend le relais. Il apprend à interroger et à transformer du texte en ligne de commande : des journaux, des exports CSV, des fichiers de configuration, des réponses d'API en JSON. Il s'adresse aux administrateurs et administratrices système, aux profils DevOps et SRE qui diagnostiquent des incidents sur des serveurs, et aux développeurs qui écrivent des étapes de CI ou des scripts d'exploitation.
L'approche
On retrouve Signalements, l'API de signalement d'incidents de voirie, et sa machine de tâches de fond sig-outils. Le jeudi 8 octobre 2026, deux demandes arrivent en même temps. La première vient des usagers : la veille, entre 14 h et 14 h 20, l'application a renvoyé des erreurs, et personne n'a été alerté. La seconde vient de la mairie d'Exempleville, qui veut désormais un rapport hebdomadaire : combien de signalements, de quel type, dans quelle commune, rapportés à la population.
Tout est déjà dans les fichiers de sig-outils : les journaux texte et JSON reçus des deux serveurs de l'API, les exports CSV quotidiens, le référentiel des communes, la configuration. Chaque leçon apporte un outil au moment où l'enquête ou le rapport en a besoin, explique ce qu'il fait réellement de chaque ligne, et montre où il cesse d'être le bon outil. En chemin, on découvre des tentatives de connexion SSH venues d'internet, des sondes de vulnérabilités, un paramètre de configuration à corriger sur deux serveurs et des journaux à anonymiser avant de les transmettre. À la fin, rapport-hebdo produit le rapport de la mairie et le volet technique de l'équipe, en Markdown et en JSON.
Les exemples visent les outils d'Ubuntu 24.04 LTS et de Debian 13 : GNU grep 3.11, GNU sed 4.9, jq 1.7.1, coreutils 9.4 et 9.7. Pour awk, les deux systèmes diffèrent, et c'est une leçon en soi : awk désigne mawk sur une Debian minimale comme sig-outils, mais gawk sur les images cloud d'Ubuntu comme sig-app-1. Les différences avec les versions BSD de macOS sont signalées quand elles piègent.
Ce qu'il faut
- Avoir suivi Linux : premiers pas, en particulier les leçons Lire et éditer des fichiers et Redirections et tubes, et les bases du cours Bash pour l'automatisation (guillemets, expansions, boucles de lecture).
- Une machine Linux avec Bash 5, Python 3 et les paquets
jqetgawken plus de ce qui est installé par défaut, ou une machine virtuelle jetable Ubuntu 24.04 ou Debian 13. La leçon 1 fournit un script qui fabrique, en local, une copie réduite des fichiers desig-outils: aucun serveur, aucun compte de cloud n'est nécessaire.
Les leçons
Les fondations
sed
awk
jq
Pour valider : le quiz (niveau 100) et le lab (niveau 200).
Plan du cours
- Penser en flux : lignes, champs et petits outils
100 Apprenti
Répondre à une question sur des journaux par une chaîne de filtres : ce qu'est vraiment une ligne et un champ, l'effet de la locale sur le tri, les classes de caractères et la vitesse, la préparation d'un bac à sable reproductible, puis wc, head et tail, cut, tr, sort et ses clés (-k, -t, -n, -h, -V, -s, -c, -m, --debug), uniq, comm, join, paste, column, tac et tee, appliqués au premier tri de l'incident du 7 octobre sur Signalements ; sous le capot, les processus d'un tube qui tournent en parallèle, le tampon de 64 Kio, la mise en tampon de la sortie, SIGPIPE et le code 141 sous pipefail, et le tri externe de sort. - grep et les expressions régulières
100 Apprenti
Chercher juste dans des journaux : ce que fait grep ligne par ligne, expressions régulières basiques (BRE) et étendues (ERE), chaînes fixes avec -F et syntaxe Perl avec -P, ancres, classes POSIX, quantificateurs, alternance et références arrière, règle du plus long à gauche, options qui choisissent ce que l'on obtient (lignes, correspondances, comptes, fichiers, code de sortie), contexte, recherche récursive, fichiers de motifs, codes de sortie 0, 1 et 2 face à set -e et pipefail, fichiers binaires, locale et performance, ReDoS. L'enquête sur l'incident du 7 octobre et les tentatives SSH de Signalements. - sed : le cycle et la substitution
200 Compagnon
Comprendre ce que sed fait de chaque ligne et s'en servir sans surprise : l'espace de travail et le cycle lire, appliquer, afficher, l'option -n, la commande s et ses drapeaux, les délimiteurs, & et les références arrière, expressions BRE et ERE, adresses par numéro, par expression et par intervalle avec leurs pièges, plusieurs commandes, blocs et scripts, p, d, q, Q, =, y et w, observation du cycle avec --debug, sauts de ligne finaux, CRLF et octet nul. Les journaux de l'incident de Signalements sont extraits, normalisés puis anonymisés par un script sed avant d'être transmis au prestataire. - sed : éditer des fichiers sans les casser
200 Compagnon
Modifier un fichier de configuration sur place sans mauvaise surprise : ce que fait réellement sed -i (fichier temporaire, renommage, nouvel inode, liens physiques rompus, liens symboliques remplacés, propriétaire et ACL recopiés, descripteurs ouverts qui gardent l'ancien contenu), suffixes de sauvegarde et incompatibilités avec macOS, modifications idempotentes limitées à une section, commandes a, i, c, r et w, espace de réserve et traitement multiligne avec N, P et D, et le moment où sed n'est plus le bon outil. La leçon produit regler-conf, qui fixe une clé dans une section d'un fichier INI et que l'on peut relancer sans risque. - awk : un langage pour les lignes et les champs
200 Compagnon
Écrire des programmes awk justes et portables : structure motif { action }, BEGIN et END, enregistrements et champs, $0, $NF, NR, NF, FNR, FS, OFS, découpage par blancs, par caractère ou par expression régulière, reconstruction de la ligne, print et printf, motifs et intervalles, next et exit, nombres et chaînes, comparaisons numériques ou textuelles, CONVFMT et OFMT, fonctions de chaînes, passage de valeurs par -v, ENVIRON et la ligne de commande, programmes dans un fichier. Différences entre mawk (Debian) et gawk (images cloud Ubuntu), locale et virgule décimale, injection de code. Les lignes de l'API de Signalements deviennent un fichier TSV propre grâce à lib/requetes.awk. - awk : agréger, joindre et produire un rapport
200 Compagnon
Passer de la ligne au bilan avec awk : tableaux associatifs, opérateur in et delete, clés composées et SUBSEP, compter, sommer, extrêmes, moyenne et centiles, dédoublonnage par !vu[$0]++, jointure de deux fichiers avec NR == FNR, getline et ses pièges, écriture vers des fichiers et des commandes avec close() et fflush(), fonctions définies par l'utilisateur, extensions de gawk (FPAT, --csv, PROCINFO, asort) et ce qu'il faut écrire à la place en POSIX. Le volet technique et le volet « mairie » du rapport hebdomadaire de Signalements deviennent deux programmes awk portables, dont un lecteur de CSV selon la RFC 4180. - jq : interroger du JSON
200 Compagnon
Lire du JSON sans le découper à la main : pourquoi grep et sed échouent sur des données structurées, le modèle de JSON selon la RFC 8259 et le format JSON Lines, le modèle de jq (un filtre transforme une entrée en zéro, une ou plusieurs sorties), chemins, itération, tranches et accès optionnels, composition par | et par la virgule, select, has, keys, length, type, valeur par défaut //, vérité de null et false, chaînes et interpolation, sorties brutes et formats @tsv, @csv, @sh, @uri, @base64, passage de valeurs du shell par --arg, --argjson et --args, codes de sortie et -e, lignes JSON cassées, générateurs et retour arrière, nombres en double précision et conservation des littéraux en jq 1.7, limites de profondeur et de mémoire. L'inventaire des instances Scaleway et l'enquête sur l'incident de Signalements, menés sur le journal JSON de l'API. - jq : transformer, produire du JSON et choisir son outil
200 Compagnon
Passer de la lecture à la production de JSON avec jq : construire des objets et des tableaux, regrouper et trier avec group_by, sort_by et unique_by, réduire un flux avec reduce, manipuler les clés avec to_entries et with_entries, les chemins avec paths, getpath et del, mettre à jour avec |=, += et //=, traiter un gros flux avec -n et inputs plutôt qu'avec -s, combiner des fichiers avec --slurpfile et --rawfile, écrire des fonctions avec def, utiliser les expressions régulières d'Oniguruma, fabriquer un message d'alerte sans jamais assembler de JSON à la main, modifier un fichier JSON sans le vider, puis assembler rapport-hebdo et choisir entre grep, sed, awk, jq, yq, Miller et Python.
Sources
- POSIX.1-2024, utilitaires grep, sed, awk, sort, uniq, cut, tr, comm, join
- GNU Grep Manual
- GNU sed Manual
- GAWK: Effective AWK Programming
- mawk, page de manuel et historique des versions
- jq 1.7 Manual
- GNU Coreutils Manual
- Aho, Kernighan et Weinberger, The AWK Programming Language, 2e édition (2023)
- IETF, RFC 8259 : The JavaScript Object Notation (JSON) Data Interchange Format
- IETF, RFC 4180 : Common Format and MIME Type for CSV Files