Introduction
Une expression régulière décrit le texte par sa structure plutôt que par une chaîne exacte. Le même langage de motifs apparaît dans de nombreux outils Linux, mais chaque outil l’utilise différemment : grep sélectionne ou extrait les correspondances, sed transforme un flux et awk combine des motifs avec des actions prenant en compte les champs.
Vous commencerez par les ancres et les classes de caractères, puis vous utiliserez la répétition étendue et l’extraction. Vous prévisualiserez ensuite des transformations avant de les enregistrer, puis vous terminerez par la sélection et l’agrégation de champs. Les motifs sont placés entre guillemets afin que le shell transmette les caractères spéciaux à l’outil de traitement du texte au lieu de les interpréter lui-même.
Faire correspondre des lignes avec une structure d’expression régulière de base
Dans cette étape, vous utiliserez du texte littéral, des ancres et des classes de caractères pour décrire des positions sur une ligne entière.
Examinez le fichier d’exercice :
cd /home/labex/project/regex-lab
nl -ba contacts.txt
Le texte littéral correspond n’importe où dans une ligne :
grep 'active' contacts.txt
^ ancre un motif au début de la ligne et $ l’ancre à la fin. Recherchez l’enregistrement d’Alice ainsi que les enregistrements se terminant par un nombre à deux chiffres :
grep '^Alice|' contacts.txt
grep '[0-9][0-9]$' contacts.txt
Entre crochets, une classe de caractères correspond à un seul caractère. [ABC] signifie A, B ou C :
grep '^[ABC]' contacts.txt | tee abc-contacts.txt
Cette commande affiche Alice, Bob et Carol. Enregistrez également les correspondances numériques ancrées :
grep '[0-9][0-9]$' contacts.txt > two-digit-values.txt
Utiliser les expressions régulières étendues et extraire les correspondances
Dans cette étape, vous utiliserez les expressions régulières étendues pour définir des alternatives et des répétitions, puis vous extrairez uniquement la sous-chaîne correspondante.
grep -E active des opérateurs tels que + (un ou plusieurs), ? (zéro ou un) et | (alternative). Recherchez les champs d’état complets active ou pending :
cd /home/labex/project/regex-lab
grep -E '\|(active|pending)\|' contacts.txt
Vous pouvez construire un motif ressemblant à une adresse e-mail par morceaux :
[[:alnum:]._-]+correspond à un ou plusieurs caractères autorisés dans la partie locale ;@est un caractère littéral ;[[:alnum:].-]+correspond au contenu du domaine ;\.[[:alpha:]]{2,}correspond à un point suivi d’un suffixe de deux lettres ou plus.
Utilisez -o pour afficher uniquement les sous-chaînes correspondantes :
grep -Eo '[[:alnum:]._-]+@[[:alnum:].-]+\.[[:alpha:]]{2,}' contacts.txt | tee emails.txt
Numérotez les lignes correspondantes et comptez les adresses extraites :
grep -En '\|(active|pending)\|' contacts.txt
wc -l < emails.txt | tr -d ' ' > email-count.txt
cat email-count.txt
La chaîne malformée dave_at_example.com ne correspond pas, car elle ne contient pas de @.
Prévisualiser des transformations avec Sed
Dans cette étape, vous transformerez un flux avec sed tout en laissant l’entrée inchangée.
Une substitution suit la forme s/pattern/replacement/flags. Remplacez uniquement le premier a de chaque ligne, puis remplacez tous les a minuscules avec l’indicateur g :
cd /home/labex/project/regex-lab
sed 's/a/A/' contacts.txt
sed 's/a/A/g' contacts.txt
Utilisez un autre délimiteur lorsque le texte contient lui-même des barres obliques ou lorsqu’un autre délimiteur améliore la lisibilité. Remplacez les domaines des adresses e-mail par redacted.invalid :
sed -E 's#@[[:alnum:].-]+\.[[:alpha:]]{2,}#@redacted.invalid#g' contacts.txt
Les adresses sed sélectionnent les lignes auxquelles une commande s’applique. Remplacez l’état uniquement sur les lignes contenant le champ exact |inactive| :
sed '/|inactive|/s/|inactive|/|disabled|/' contacts.txt | tee contacts-preview.txt
Vérifiez que le fichier d’origine contient toujours inactive :
grep '|inactive|' contacts.txt
Créer un fichier nettoyé avec Sed
Dans cette étape, vous combinerez plusieurs commandes sed et enregistrerez le flux transformé dans un nouveau fichier.
L’en-tête de services.csv doit rester inchangé. Pour les lignes de données, remplacez warn par warning et ajoutez le suffixe ms au dernier champ numérique. -e fournit plusieurs commandes, et l’adresse 2,$ limite leur application aux lignes 2 jusqu’à la fin :
cd /home/labex/project/regex-lab
sed -E -e '2,$ s/,warn,/,warning,/' -e '2,$ s/([0-9]+)$/\1ms/' services.csv | tee services-clean.csv
Ici, les parenthèses capturent les chiffres finaux et \1 réutilise cette capture dans le remplacement.
Comparez les fichiers d’origine et le nouveau fichier :
diff -u services.csv services-clean.csv || true
Le code de sortie différent de zéro de diff est attendu, car la sortie a été volontairement modifiée ; || true permet à une séquence de commandes copiée de continuer.
Sélectionner des champs et agréger des données avec Awk
Dans cette étape, vous utiliserez awk lorsqu’une tâche nécessite à la fois la structure des champs et des calculs.
-F, définit la virgule comme séparateur d’entrée. Affichez le service et l’état uniquement pour les lignes de données ; NR correspond au numéro de l’enregistrement courant :
cd /home/labex/project/regex-lab
awk -F, 'NR > 1 {print $1, $2}' services.csv
Sélectionnez les lignes dont le troisième champ numérique est supérieur à 200 :
awk -F, 'NR > 1 && $3 > 200 {print $1, $3}' services.csv | tee slow-services.txt
Accumulez un total et un nombre d’éléments, puis calculez une moyenne dans le bloc END. printf contrôle le format numérique :
awk -F, 'NR > 1 {sum += $3; count++} END {printf "average_latency=%.1f\n", sum/count}' services.csv | tee latency-summary.txt
Les motifs d’Awk déterminent pour quels enregistrements une action est exécutée ; des champs tels que $1 et $3 rendent les calculs structurés plus lisibles.
Résumé
Vous avez construit des motifs d’expression régulière à partir d’ancres, de classes, d’alternatives et de répétitions ; utilisé grep pour sélectionner et extraire ; utilisé sed pour prévisualiser et enregistrer des transformations ; et utilisé awk pour sélectionner et agréger des données en fonction des champs. Le prochain Challenge vous demandera d’appliquer ces notions sans recevoir une séquence complète de commandes.



