🧠 Projet 9 – Expressions régulières et parsing en Bash
🧠 Projet 9 – Expressions régulières et parsing en Bash

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

ConceptExemple 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.

ConceptExemple concret
Rechercher un motif simplegrep "error" /var/log/syslog → affiche les lignes contenant error.
Utiliser des regex étenduesgrep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log → détecte des adresses IP.
Inverser la recherchegrep -vE "^#" config.conf → ignore les lignes commentées.
Afficher uniquement la correspondancegrep -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é.

ConceptExemple concret
Substituer du textesed 's/erreur/ERROR/g' app.log → remplace chaque erreur par ERROR.
Supprimer des lignes inutilessed '/^#/d' config.cfg → supprime les commentaires.
Extraire une valeur avec capturesed -nE 's/^Nom: (.*)$/\1/p' infos.txt → affiche uniquement les valeurs après “Nom:”.
Nettoyer un formatsed -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.

ConceptExemple concret
Sélectionner les utilisateurs avec Bashawk -F: '$7~/bash$/ {print $1}' /etc/passwd → affiche tous les utilisateurs dont le shell est Bash.
Extraire et reformaterawk -F, '{print $2 " - " $3}' rapport.csv → affiche le 2e et 3e champ séparés par “ – ”.
Calculer sur des colonnesawk '{s+=$3} END {print s}' data.log → somme la 3e colonne.
Combiner motif et actionawk '/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.

ConceptExemple concret
Validation d’un formatif [[ "$ip" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then echo "IP valide"; fi
Extraire des sous-valeursif [[ "$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) et awk (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.txt et les renomme en archive-2024.txt grâce à [[ =~ ]].


🔹 5) Bonnes pratiques et astuces

ConceptAstuce
EncodageToujours s’assurer que les fichiers sont en UTF-8 avant de parser.
QuotingDans 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

ObjectifDescription
1. Logs ApacheExtraire toutes les IP uniques et les trier.
2. Fichier CSVExtraire les lignes dont la 3ᵉ colonne contient un chiffre supérieur à 100.
3. Comptes LinuxAfficher tous les utilisateurs ayant /bin/bash comme shell.
4. Renommage intelligentRenommer tous les fichiers .log en .bak en utilisant une boucle et une regex.

🔹 7) Solutions des exercices

🧠 Projet 9 – Expressions régulières et parsing en Bash

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 :

Leave a Comment

Comments

No comments yet. Why don’t you start the discussion?

    Alors tu en pense quoi de cette article ? Dis-moi tous..