Les expressions régulières (regex) sont le langage commun de grep, sed et awk. Sans elles, vous cherchez du texte ligne par ligne. Avec elles, vous filtrez des milliers de lignes en une commande, extrayez des champs structurés et détectez des anomalies dans des logs en production.
Ce guide couvre les regex POSIX — utilisées nativement par les outils Linux — et leur extension ERE que grep -E et sed -E activent.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Utiliser les ancres
^et$, le point.et les classes[...] - Appliquer les quantificateurs BRE (
\{n,m\}) et ERE ({n,m},+,?) - Extraire seulement la partie matchée avec
grep -oE - Nettoyer un fichier de config avec
sedet des regex - Reformater des données avec des groupes de capture
\(...\)et\1 - Reconnaître et éviter les deux pièges les plus fréquents
Dans quel contexte ?
Section intitulée « Dans quel contexte ? »Vous ne maîtrisez pas les regex pour faire beau sur un CV — vous en avez besoin dès que vous travaillez sérieusement avec grep, sed ou awk. Exemples concrets : extraire toutes les adresses IP d’un log pour les bloquer dans un pare-feu ; détecter les lignes d’un fichier de configuration qui ne respectent pas un format attendu avant de le déployer ; corriger en masse des noms de variables dans des dizaines de fichiers de config ; filtrer uniquement les erreurs critiques dans un flux de logs en temps réel. Les regex sont transversales — une fois que vous les maîtrisez dans grep, vous les réutilisez immédiatement dans sed, awk, Python, votre IDE et vos pipelines CI. C’est l’un des investissements techniques les mieux amortis en administration système.
BRE vs ERE : les deux dialectes POSIX
Section intitulée « BRE vs ERE : les deux dialectes POSIX »Linux utilise deux variantes de POSIX regex :
| Dialecte | Activé par | Syntaxe quantificateurs |
|---|---|---|
| BRE (Basic) | grep, sed par défaut | \{n,m\}, \+, \? |
| ERE (Extended) | grep -E, sed -E, awk | {n,m}, +, ?, | |
Les blocs de base
Section intitulée « Les blocs de base »Ancres — fixer la position
Section intitulée « Ancres — fixer la position »grep '^192' serveurs.txt # lignes commençant par 192grep '\.com$' serveurs.txt # lignes se terminant par .comgrep '^$' fichier.txt # lignes videsgrep -v '^#' config.ini # exclure les commentairesLes ancres ne consomment pas de caractères, elles fixent où le match doit se produire.
Classes de caractères
Section intitulée « Classes de caractères »Une classe [...] matche un seul caractère parmi ceux listés :
grep '[0-9]' fichier.txt # contient un chiffregrep '[a-zA-Z]' fichier.txt # contient une lettregrep '[^0-9]' fichier.txt # contient un non-chiffre (^ = négation)Les classes POSIX sont portables entre distributions :
| Classe | Équivalent | Usage |
|---|---|---|
[[:digit:]] | [0-9] | Chiffres |
[[:alpha:]] | [a-zA-Z] | Lettres |
[[:alnum:]] | [a-zA-Z0-9] | Lettres et chiffres |
[[:space:]] | [ \t\n] | Espaces et tabulations |
[[:lower:]] | [a-z] | Minuscules |
[[:upper:]] | [A-Z] | Majuscules |
# Lignes qui commencent par des espaces (indentation)grep '^[[:space:]]\+' config.ini
# Lignes vides ou avec seulement des espacesgrep '^[[:space:]]*$' config.iniLe point .
Section intitulée « Le point . ». matche n’importe quel caractère (sauf saut de ligne) :
grep 'ser.eur' serveurs.txt # serv-eur, ser_eur, serveur...grep '10\.0' serveurs.txt # 10.0 littéral (point échappé)Quantificateurs
Section intitulée « Quantificateurs »Ils s’appliquent au caractère ou groupe qui précède :
| BRE | ERE | Signification |
|---|---|---|
* | * | 0 ou plus |
\+ | + | 1 ou plus |
\? | ? | 0 ou 1 (optionnel) |
\{n\} | {n} | Exactement n fois |
\{n,m\} | {n,m} | Entre n et m fois |
\{n,\} | {n,} | n ou plus |
# BRE — octets dans une adresse IP (1 à 3 chiffres)grep '[0-9]\{1,3\}\.[0-9]\{1,3\}' serveurs.txt
# ERE — même chose, syntaxe plus lisiblegrep -E '[0-9]{1,3}\.[0-9]{1,3}' serveurs.txtgrep -E : les super-pouvoirs ERE
Section intitulée « grep -E : les super-pouvoirs ERE »ERE ajoute l’alternance | et les parenthèses () sans backslash :
# Codes d'erreur 4xx ou 5xx dans un access.loggrep -E '" [45][0-9]{2} ' access.log
# Lignes qui contiennent error OU warning (insensible à la casse)grep -iE 'error|warning' syslog
# Séquences de 2 à 4 chiffres adjacentsgrep -E '[0-9]{2,4}' fichier.txtgrep -o : extraire seulement le match
Section intitulée « grep -o : extraire seulement le match »Par défaut, grep affiche la ligne entière. -o n’affiche que la partie matchée :
# Extraire toutes les adresses IP d'un loggrep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' access.log192.168.1.1010.0.0.5192.168.1.20172.16.0.1192.168.1.10Combiner avec sort | uniq -c | sort -rn pour un top des IP :
grep -oE '[0-9]{1,3}(\.[0-9]{1,3}){3}' access.log \ | sort | uniq -c | sort -rn | head -10Valider un format
Section intitulée « Valider un format »# Adresses email (format simplifié)grep -E '^[[:alnum:]._+-]+@[[:alnum:].-]+\.[[:alpha:]]{2,}$' fichier.txt
# Adresses IPv4 strictes (0-255 par octet — approximation utile)grep -E '^([0-9]{1,3}\.){3}[0-9]{1,3}$' serveurs.txtsed -E : transformer avec des regex
Section intitulée « sed -E : transformer avec des regex »Nettoyer un fichier de configuration
Section intitulée « Nettoyer un fichier de configuration »# Supprimer les commentaires et lignes videssed '/^#/d; /^$/d' config.ini
# Supprimer les espaces en début de lignesed 's/^[[:space:]]*//' config.ini
# Normaliser le séparateur — accepter ' = ' et '=' → uniformiser en '='sed -E 's/ *= */=/' config.iniEnchaîner les trois :
sed '/^#/d; /^$/d' config.ini \ | sed 's/^[[:space:]]*//' \ | sed -E 's/ *= */=/'serveur=web-prod-01port=8080timeout=30debug=falsemax_connections=100log_level=INFOGroupes de capture et backreferences
Section intitulée « Groupes de capture et backreferences »Les parenthèses capturent une partie du match, réutilisable avec \1, \2… :
# Convertir une date ISO en format DD/MM/YYYYecho "2026-04-09" | sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/'# → 09/04/2026
# Inverser prénom et nom (séparés par une virgule)echo "Robert, Stephane" | sed -E 's/([^,]+), ([^,]+)/\2 \1/'# → Stephane Robertawk avec des regex
Section intitulée « awk avec des regex »awk utilise ERE nativement. Les patterns s’écrivent entre / :
# Afficher les lignes dont l'IP est dans 192.168.1.xawk '/^192\.168\.1\./' access.log
# Lignes avec status HTTP 200 (champ 9)awk '$9 == 200' access.log
# Combiner condition champ et regexawk '$9 ~ /^[45]/' access.log # status 4xx ou 5xxawk '$9 !~ /^[45]/' access.log # status autre que 4xx/5xxL’opérateur ~ teste une regex sur un champ, !~ en est la négation.
Cas d’usage admin récapitulatifs
Section intitulée « Cas d’usage admin récapitulatifs »# Top 5 des IP les plus actives dans un access.loggrep -oE '^[0-9.]+' access.log | sort | uniq -c | sort -rn | head -5
# Toutes les lignes d'erreur (ERROR ou WARN, peu importe la casse)grep -iE 'error|warn' /var/log/syslog | tail -20
# Extraire les ports ouverts d'un ss -tulnpss -tulnp | grep -oE ':[0-9]+' | sort -t: -k2 -n | uniq
# Valider que toutes les lignes d'un fichier d'inventaire sont au bon format IPgrep -vE '^([0-9]{1,3}\.){3}[0-9]{1,3}$' inventaire.txt \ && echo "Format invalide détecté !"
# Nettoyer un /etc/hosts : enlever commentaires et lignes videsgrep -vE '^[[:space:]]*(#|$)' /etc/hostsÀ retenir
Section intitulée « À retenir »grep= BRE par défaut ; ajoutez-Epour ERE dès que vous utilisez+,?,{n}ou|.grep -oextrait seulement la partie matchée — combinez avecsort | uniq -cpour des statistiques.sed -E 's/pattern/remplacement/'transforme ; les groupes(...)se rappellent avec\1.- Deux pièges à éviter : le point non échappé (
\.pour un point littéral) et la gourmandise ([^x]*au lieu de.*). - Les classes POSIX
[[:digit:]],[[:alpha:]],[[:space:]]sont portables sur toutes les distributions.