Introduction
Les expressions régulières (regex) sont la trousse à outils secrète des administrateurs système : elles permettent de repérer, filtrer, transformer et valider des chaînes de texte à la volée.
Dans un environnement Bash, elles sont indispensables pour trier des logs, auditer des comptes, extraire des adresses IP, ou renommer en masse des fichiers.
Ce projet t’explique comment les utiliser avec grep, sed, awk et [[ =~ ]], quatre piliers du parsing natif Linux, sans dépendances extérieures.
🔹 1) Comprendre les expressions régulières
| Concept | Exemple concret |
|---|---|
| Une regex est un motif qui décrit une forme de texte plutôt qu’un texte fixe. Elle peut chercher une suite de caractères, une structure (comme une adresse mail), ou un format (comme une IP). | Motif : ^[A-Z][a-z]+$ → sélectionne les mots commençant par une majuscule suivie de lettres minuscules. Test rapide : `echo « Linux » |
Les caractères spéciaux donnent la puissance : . (n’importe quel caractère), ^ (début de ligne), $ (fin), [] (ensemble de caractères), () (groupes), + (au moins un), * (zéro ou plus). | grep -E "^[0-9]+$" users.txt → affiche les lignes contenant uniquement des chiffres. |
🔹 2) Les trois outils classiques du parsing texte
🧩 grep — filtrer
grep affiche uniquement les lignes correspondant à un motif.
Il est rapide, simple, et souvent le premier réflexe.
| Concept | Exemple concret |
|---|---|
| Rechercher un motif simple | grep "error" /var/log/syslog → affiche les lignes contenant error. |
| Utiliser des regex étendues | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log → détecte des adresses IP. |
| Inverser la recherche | grep -vE "^#" config.conf → ignore les lignes commentées. |
| Afficher uniquement la correspondance | grep -oE "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}" mail_list.txt → extrait toutes les adresses e-mail. |
💡 Astuce performance : ajoute LC_ALL=C avant grep pour accélérer les recherches sur de gros fichiers texte.
🧩 sed — transformer
sed agit comme un mini-robot d’édition : il lit ligne par ligne, applique des règles de recherche/remplacement et renvoie le flux modifié.
| Concept | Exemple concret |
|---|---|
| Substituer du texte | sed 's/erreur/ERROR/g' app.log → remplace chaque erreur par ERROR. |
| Supprimer des lignes inutiles | sed '/^#/d' config.cfg → supprime les commentaires. |
| Extraire une valeur avec capture | sed -nE 's/^Nom: (.*)$/\1/p' infos.txt → affiche uniquement les valeurs après “Nom:”. |
| Nettoyer un format | sed -E 's/[[:space:]]+/ /g' data.txt → réduit tous les espaces multiples en un seul. |
🧩 awk — structurer et analyser
awk agit comme un petit langage orienté données.
Il lit des fichiers ligne par ligne, découpe chaque ligne en champs (délimités par un séparateur), et applique des actions selon des motifs.
| Concept | Exemple concret |
|---|---|
| Sélectionner les utilisateurs avec Bash | awk -F: '$7~/bash$/ {print $1}' /etc/passwd → affiche tous les utilisateurs dont le shell est Bash. |
| Extraire et reformater | awk -F, '{print $2 " - " $3}' rapport.csv → affiche le 2e et 3e champ séparés par “ – ”. |
| Calculer sur des colonnes | awk '{s+=$3} END {print s}' data.log → somme la 3e colonne. |
| Combiner motif et action | awk '/ERROR/ {print NR ":" $0}' logfile → ajoute le numéro de ligne devant chaque erreur. |
💡 awk comprend aussi des fonctions comme match(), sub(), gsub() pour modifier du texte à la volée avec des regex.
🔹 3) Le test regex intégré à Bash : [[ =~ ]]
Depuis Bash 3, l’opérateur =~ permet de comparer une chaîne à une regex sans passer par grep ou sed.
C’est plus rapide et plus lisible dans un script.
| Concept | Exemple concret |
|---|---|
| Validation d’un format | if [[ "$ip" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then echo "IP valide"; fi |
| Extraire des sous-valeurs | if [[ "$url" =~ ^https?://([^/]+)/ ]]; then echo "Domaine : ${BASH_REMATCH[1]}"; fi |
| Tester un nombre | [[ $val =~ ^[0-9]+$ ]] && echo "Nombre valide" |
| Contrôle de saisie | `read -p « Entrer un email : » mail; [[ $mail =~ ^[[:alnum:]_.+-]+@[[:alnum:].-]+$ ]] |
💡 Le tableau spécial BASH_REMATCH contient les sous-groupes capturés entre parenthèses : ${BASH_REMATCH[0]} = match complet, ${BASH_REMATCH[1]} = première capture, etc.
🔹 4) Cas pratiques Bash natif
🧰 Lister les shells utilisés sur le système
awk -F: '{print $NF}' /etc/passwd | sort -u
Affiche la liste unique des interpréteurs de commandes (bash, zsh, nologin…).
Idéal pour repérer les shells réellement actifs sur une machine multi-utilisateurs.
🧰 Identifier les comptes ayant un mot de passe défini
sudo awk -F: '$2!~/[*!]/ {print $1}' /etc/shadow
Liste uniquement les utilisateurs dont le champ de mot de passe contient un hash (et non un
*ou!).
Parfait pour vérifier les comptes réellement actifs.
🧰 Filtrer les erreurs système dans les logs
grep -E "(ERROR|CRITICAL|FAIL)" /var/log/syslog | awk '{print $1, $2, $5}'
Combine
grep(sélection des lignes contenant des erreurs) etawk(extraction des colonnes : date, heure, message).
🧰 Extraire les adresses IP uniques
grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log | sort -u
Idéal pour obtenir la liste des clients qui se sont connectés à un serveur web.
🧰 Renommer des fichiers automatiquement
for f in *.txt; do
if [[ $f =~ ^rapport_([0-9]{4})\.txt$ ]]; then
mv "$f" "archive-${BASH_REMATCH[1]}.txt"
fi
done
Le script détecte les fichiers
rapport_2024.txtet les renomme enarchive-2024.txtgrâce à[[ =~ ]].
🔹 5) Bonnes pratiques et astuces
| Concept | Astuce |
|---|---|
| Encodage | Toujours s’assurer que les fichiers sont en UTF-8 avant de parser. |
| Quoting | Dans les regex Bash, éviter les guillemets doubles autour du motif ; préférer les simples ou aucune si possible. |
| Performance | Éviter les boucles “cat |
| Lisibilité | Tester les regex dans un terminal avant de les intégrer dans un script. |
| Sécurité | Ne jamais appliquer une regex sur du texte arbitraire sans valider la source (logs, entrées utilisateurs). |
🔹 6) Exercices pratiques
| Objectif | Description |
|---|---|
| 1. Logs Apache | Extraire toutes les IP uniques et les trier. |
| 2. Fichier CSV | Extraire les lignes dont la 3ᵉ colonne contient un chiffre supérieur à 100. |
| 3. Comptes Linux | Afficher tous les utilisateurs ayant /bin/bash comme shell. |
| 4. Renommage intelligent | Renommer tous les fichiers .log en .bak en utilisant une boucle et une regex. |
🔹 7) Solutions des exercices

1️⃣ Logs Apache
grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log | sort -u
2️⃣ CSV
awk -F, '$3>100 {print $0}' data.csv
3️⃣ Comptes Linux
awk -F: '$7=="/bin/bash" {print $1}' /etc/passwd
4️⃣ Renommage
for f in *.log; do mv "$f" "${f%.log}.bak"; done
🔹 8) Conclusion
Les expressions régulières sont à la fois un art et une science.
Dans un simple script Bash, elles transforment de longues tâches manuelles en commandes élégantes.
Grâce à grep, sed, awk, et [[ =~ ]], tu peux filtrer, restructurer et valider presque n’importe quel texte — sans quitter ton terminal.
Les regex ne sont pas qu’un outil : ce sont des lunettes pour voir l’ordre caché dans le chaos des logs.
Et toi, quels types de données aimerais-tu parser ? Partage tes idées et tes lignes magiques en commentaire !
Souhaites-tu que je le formate maintenant pour publication WordPress (2 colonnes équilibrées, SEO complet, Yoast, méta, slug, liens internes) avant la mise en brouillon sur msinfra.fr ?
🧭 Pour aller plus loin avant ou après ce projet :
Avant de plonger dans les tableaux et structures, jette un œil à ces articles complémentaires :
- 🧠 Bases du scripting Bash — comprendre le shebang, les variables et la structure d’un script.
- ⚙️ Variables et opérateurs en Bash — tout sur les variables spéciales, d’environnement et les opérateurs.
- 🔁 Boucles et conditions en Bash — la logique répétitive : for, while, if, case.
- 🧩 Tableaux, dictionnaires – structures avancées en Bash – Part 4
- 🧠Gestion des erreurs et débogage en Bash – maîtriser la gestion des erreurs Bash, du
set -eautrap ERR– Part 5 - 🧾 Fichiers, logs et flux en Bash (Audit & Maintenance) – Savoir les lire, les transformer, les filtrer – Part 6
- 🧰 Services, réseau et supervision sous Linux – Du systemctl au monitoring Bash – Part 7
- 🧱 Projet 8 – Bash & Active Directory (avancé / hybride Linux-Windows) – Part 8
