infra / linux-bash
Expressions régulières et grep/sed/awk
Explication
Chercher un mot exact, tu sais déjà faire. Une expression régulière (regex) va plus loin : c'est un langage pour décrire un motif de texte plutôt qu'un texte exact, ce qui devient indispensable dès qu'on traite des logs ou des fichiers volumineux où l'on ne connaît pas à l'avance la valeur exacte recherchée.
Ce que vous allez apprendre
- Écrire une expression régulière simple pour trouver un motif (une IP, une erreur, un email)
- Choisir le bon outil selon le besoin :
greppour filtrer,sedpour transformer,awkpour analyser des colonnes - Utiliser les options essentielles de
grep(-i,-v,-c,-n,-r,-E) - Remplacer du texte dans un fichier avec
sed -isans casser la production - Extraire, filtrer et agréger des colonnes de données avec
awk
Dans quel contexte ?
Un développeur doit analyser le fichier /var/log/nginx/access.log d'un serveur en production pour répondre à trois questions différentes : combien de requêtes ont renvoyé une erreur 500 aujourd'hui (grep), remplacer une URL obsolète dans un fichier de configuration avant un redéploiement (sed), et calculer le volume total de données transférées par jour (awk). Trois outils, trois usages bien distincts, mais un seul langage de motifs commun : la regex.
Une fois ce principe compris, il faut distinguer trois outils qui l'utilisent
| Outil | Répond à la question | Exemple |
|---|---|---|
grep | Quelles lignes contiennent ce motif ? | grep "ERROR" app.log |
sed | Comment transformer chaque ligne ? | sed 's/http/https/' fichier.txt |
awk | Comment analyser des colonnes de données ? | awk '{sum += $10} END {print sum}' |
grep répond à une question simple : "quelles lignes contiennent ce motif ?" C'est un filtre, rien de plus. sed va plus loin : il transforme chaque ligne, comme un éditeur automatique. awk, enfin, est un mini-langage complet, capable de faire des sommes, des comptages, des conditions sur des données en colonnes.
Comprendre cette répartition des rôles évite de vouloir tout faire avec un seul outil au prix d'une syntaxe illisible. Chaque outil a sa spécialité, et les combiner en pipe est souvent la meilleure approche.
Prérequis
Être à l'aise avec les pipes (|) et les redirections, vus dans la leçon précédente, car grep, sed et awk sont presque toujours combinés entre eux ou avec d'autres commandes.
Une nuance à connaître : pourquoi grep -E existe
Il existe historiquement plusieurs "dialectes" de regex, un mode basique et un mode étendu. Le mode étendu (-E) simplifie l'écriture en évitant d'avoir à échapper certains symboles comme + ou |. C'est un détail historique, mais il explique pourquoi une même regex peut se comporter différemment selon l'outil ou l'option utilisée.
Piège dangereux
Utiliser sed -i 's/old/new/g' config.yml directement sur un fichier de production, sans avoir testé la commande au préalable sans -i pour voir le résultat affiché à l'écran, est une source classique de dégâts. La modification en place est immédiate et sans aucune confirmation demandée — ajoute -i.bak pour garder une sauvegarde automatique du fichier d'origine.
Maintenant que tu sais filtrer et transformer du texte, la prochaine leçon te montre comment retrouver des fichiers eux-mêmes dans une arborescence, avec find et xargs.
Commandes & code
Expressions régulières et grep/sed/awk
# --- grep : recherche de motifs ---
grep "ERROR" app.log # lignes contenant "ERROR"
grep -i "error" app.log # insensible à la casse
grep -v "DEBUG" app.log # inverse : lignes NE contenant PAS "DEBUG"
grep -c "ERROR" app.log # compte les occurrences
grep -n "ERROR" app.log # affiche les numéros de ligne
grep -r "TODO" ./src # récursif dans un dossier
grep -l "TODO" ./src/*.py # liste seulement les noms de fichiers
grep -B2 -A2 "Exception" app.log # 2 lignes de contexte avant/après
grep -E "ERROR|WARN|FATAL" app.log # regex étendue (alternatives)
grep -oE "[0-9]{1,3}(\.[0-9]{1,3}){3}" app.log # extrait toutes les IPv4
# --- Regex de base (BRE/ERE) ---
# . n'importe quel caractère ^ début de ligne
# $ fin de ligne * 0 ou plusieurs répétitions
# + 1 ou plusieurs (ERE / grep -E) ? 0 ou 1 (ERE / grep -E)
# [abc] un caractère parmi a, b, c [^abc] aucun de ces caractères
# [0-9] un chiffre \d en PCRE (grep -P)
# {n,m} entre n et m répétitions (a|b) alternative (ERE)
# --- sed : édition de flux (substitution, suppression, insertion) ---
sed 's/http/https/' fichier.txt # remplace la 1ère occurrence par ligne
sed 's/http/https/g' fichier.txt # remplace TOUTES les occurrences
sed -i 's/DEBUG=false/DEBUG=true/' .env # -i modifie le fichier en place
sed -i.bak 's/old/new/g' config.yml # -i.bak garde une sauvegarde .bak
sed -n '10,20p' fichier.txt # affiche uniquement les lignes 10 à 20
sed '/^#/d' config.conf # supprime les lignes de commentaire
sed -n '/DEBUT/,/FIN/p' fichier.txt # affiche entre deux motifs
# --- awk : traitement par colonnes (le plus puissant des trois) ---
awk '{print $1}' access.log # 1ère colonne (séparateur = espace par défaut)
awk -F: '{print $1}' /etc/passwd # -F change le séparateur (":" ici)
awk '{print $1, $NF}' access.log # 1ère colonne et dernière colonne ($NF)
awk '$9 == 500 {print $0}' access.log # lignes où la 9e colonne vaut 500
awk '{sum += $10} END {print sum}' access.log # somme d'une colonne (ex: octets transférés)
awk '{count[$1]++} END {for (ip in count) print ip, count[ip]}' access.log # comptage par IP
awk 'NR==1{next} {print}' data.csv # saute la première ligne (en-tête CSV)Résumé
greptrouve,sedtransforme ligne par ligne,awktraite par colonnes/agrégats.grep -Eactive les regex étendues (+,?,|) sans devoir tout échapper.sed -imodifie en place : toujours tester sans-id'abord sur un fichier critique.
Exercices pratiques
Mission : auditer et corriger un fichier de configuration avant redéploiement
Objectif : Combiner grep, sed et awk pour analyser un log de production et corriger une configuration en toute sécurité.
Contexte
Avant un redéploiement, tu dois analyser /var/log/nginx/access.log pour repérer les erreurs, corriger une URL obsolète dans nginx.conf, et calculer un volume de données transféré. Chaque tâche correspond à un des trois outils de cette leçon.