« Une regex compliquée est forcément plus précise. »
Une expression rationnelle utile traduit un format observable, reste lisible et possède des tests positifs et négatifs. La complexité non testée augmente le risque de faux positifs.
01Prépare les données
chmod +x module5-text-automation-lab.sh
./module5-text-automation-lab.sh setup
export LAB="/tmp/soria-linux-text-$USER"
./module5-text-automation-lab.sh status
02Commence par des ancres
grep -E '^2026-08-04T' "$LAB/data/access.log"
grep -E 'client=[0-9.]+$' "$LAB/data/access.log"
grep -Ev '^2026-08-04T.*client=[0-9.]+$' "$LAB/data/access.log"
^ ancre le début et $ la fin. La troisième commande révèle la ligne malformée au lieu de la masquer.
03Utilise les classes de caractères
grep -E 'status=[0-9]{3}' "$LAB/data/access.log"
grep -E 'status=(4|5)[0-9]{2}' "$LAB/data/access.log"
grep -E 'method=(GET|POST)' "$LAB/data/access.log"
[0-9]status=[0-9][^ ]path=[^ ]++[0-9]+3[0-9]3(a|b)(GET|POST)04Distingue BRE et ERE
printf '%s
' GET POST PUT | grep 'GET\|POST'
printf '%s
' GET POST PUT | grep -E 'GET|POST'
Avec grep classique, l’alternative BRE nécessite souvent un échappement. Avec grep -E, les groupes, alternatives et quantificateurs étendus sont plus lisibles.
05Construis un validateur de ligne
pattern='^[0-9]{4}-[0-9]{2}-[0-9]{2}T[^ ]+ method=(GET|POST) path=[^ ]+ status=[0-9]{3} bytes=[0-9]+ duration_ms=[0-9]+ client=[0-9.]+$'
grep -En "$pattern" "$LAB/data/access.log"
grep -Env "$pattern" "$LAB/data/access.log"
06Teste une regex sur un jeu minimal
printf '%s
' 'status=200' 'status=50' 'xstatus=500' 'status=404 extra' | grep -E '^status=[0-9]{3}$'
Le jeu contient un cas valide, une longueur incorrecte, un préfixe inattendu et un suffixe supplémentaire.
Détecte les événements SSH
Écris trois regex : authentification réussie, mot de passe refusé et adresse IPv4 source. Fournis pour chacune au moins un cas positif et un cas négatif tirés de auth.log.
✓Ce que tu retiens
Une regex est un contrat de format. Les ancres, classes et quantificateurs doivent être choisis à partir des données, puis prouvés sur des lignes qui doivent correspondre et d’autres qui doivent être rejetées.