Introduction
Dans cet atelier, nous allons explorer les techniques avancées de traitement de texte sous Linux, en mettant l'accent sur les expressions régulières. Nous utiliserons diverses commandes pour rechercher, filtrer et manipuler du texte, vous apportant ainsi des compétences essentielles pour travailler avec des données textuelles dans les systèmes d'exploitation de type Unix. Que vous soyez débutant ou que vous cherchiez à approfondir vos connaissances, ce laboratoire vous fournira une base solide en traitement de texte et en expressions régulières.
Comprendre les expressions régulières avec Grep
Les expressions régulières (regex) sont des motifs utilisés pour faire correspondre des combinaisons de caractères dans des chaînes de caractères. Elles sont fondamentales pour de nombreuses tâches de traitement de texte sous Linux. Nous allons commencer par utiliser grep avec des expressions régulières de base.
Tout d'abord, créons un fichier texte simple pour nous exercer :
cd ~/project
echo -e "labex\nexlab\nlab*\nLABEX\nLab" > practice.txt
Cette commande crée un fichier nommé practice.txt dans votre répertoire actuel avec cinq lignes de texte. L'option -e nous permet d'utiliser des caractères d'échappement comme \n pour les sauts de ligne.
Maintenant, utilisons grep avec une expression régulière de base :
grep "lab" practice.txt
Vous devriez voir :
labex
exlab
lab*
Cette commande affiche toutes les lignes contenant "lab". Notez qu'elle est sensible à la casse, donc "LABEX" et "Lab" ne sont pas inclus dans la sortie.
Essayons une regex plus spécifique :
grep "^lab" practice.txt
Vous devriez voir :
labex
lab*
Le symbole ^ correspond au début d'une ligne, donc cette commande ne sélectionne que les lignes qui commencent par "lab".
Maintenant, rendons notre recherche insensible à la casse :
grep -i "lab" practice.txt
Cela devrait correspondre aux cinq lignes du fichier.
Explications :
grepest la commande que nous utilisons pour rechercher des motifs.- Le motif recherché est entouré de guillemets.
practice.txtest le fichier dans lequel nous effectuons la recherche.- L'option
-irend la recherche insensible à la casse.
Utilisation avancée de Grep
Explorons quelques fonctionnalités plus avancées de grep qui peuvent rendre vos recherches de texte plus puissantes et efficaces.
Afficher les numéros de ligne :
grep -n "lab" practice.txtCela affichera les numéros de ligne des correspondances. L'option
-nindique àgrepde faire précéder chaque ligne de sortie par son numéro dans le fichier texte.Afficher les lignes avant et après la correspondance :
grep -C 1 "exlab" practice.txtL'option
-C 1affiche une ligne de contexte avant et après la ligne correspondante. Vous pouvez ajuster ce nombre pour afficher plus ou moins de lignes de contexte.Inverser la correspondance :
grep -v "lab" practice.txtL'option
-vinverse la recherche, affichant les lignes qui ne contiennent pas le motif. C'est utile lorsque vous souhaitez exclure certains motifs de vos résultats.Utiliser des expressions régulières complexes :
grep "lab[ex]*" practice.txtCette regex correspond à "lab" suivi de n'importe quel nombre de caractères "e" ou "x". Cela démontre comment utiliser des motifs plus complexes dans vos recherches.
Explications :
- L'option
-npréfixe chaque ligne de sortie avec son numéro de ligne d'origine. -C 1montre une ligne de contexte autour de la correspondance, vous aidant à comprendre l'environnement du texte trouvé.-vinverse le filtrage, ne montrant que ce qui ne correspond pas.[ex]*est une regex qui correspond à zéro ou plusieurs occurrences de 'e' ou 'x'.
Essayez ces commandes et observez les résultats. La compréhension de ces options améliorera considérablement votre capacité à rechercher et filtrer du texte efficacement.
Introduction à Sed
sed (stream editor) est un outil puissant pour analyser et transformer du texte. Il est souvent utilisé pour effectuer des modifications automatisées sur des fichiers ou des flux de sortie. Commençons par quelques opérations de base avec sed.
Comprendre la syntaxe de Sed
Avant de passer aux exemples, il est crucial de comprendre la syntaxe de base des commandes sed, en particulier l'utilisation des délimiteurs et des caractères spéciaux.
Structure de la commande Sed
La structure de base d'une commande de substitution sed est la suivante :
sed 's/motif/remplacement/drapeaux' nom_du_fichier
Détail de la syntaxe :
s= commande de substitution (substitute)/= délimiteur (sépare le motif, le remplacement et les drapeaux)motif= ce qu'il faut rechercherremplacement= par quoi le remplacerdrapeaux= options commeg(global),i(insensible à la casse)
Comprendre les délimiteurs : Barre oblique (/) vs Barre oblique inversée ()
Barres obliques (/) comme délimiteurs :
- Utilisées pour séparer les différentes parties de la commande de substitution.
- Format :
s/recherche/remplacement/drapeaux - Les caractères
/ne font pas partie du motif de recherche ou du texte de remplacement. - Exemple :
s/Hello/Hi/gsignifie "remplacer Hello par Hi globalement".
Barres obliques inversées () pour l'échappement :
- Utilisées pour échapper des caractères spéciaux ou indiquer une interprétation littérale.
- Utilisées avec des commandes comme
i\(insérer) eta\(ajouter). - Exemple :
1i\First linesignifie "insérer 'First line' avant la ligne 1".
Différence clé :
/= séparateurs entre les parties de la commande.\= caractère d'échappement ou terminateur de commande.
Tout d'abord, créez un nouveau fichier pour travailler :
echo -e "Hello, world\nThis is a test\nHello, labex\nWorld of Linux" > sed_test.txt
Cela crée un fichier nommé sed_test.txt dans votre répertoire actuel avec quatre lignes de texte.
Maintenant, utilisons sed pour remplacer du texte :
sed 's/Hello/Hi/' sed_test.txt
Analyse de cette commande :
s= commande de substitution.- Premier
/= commence le motif de recherche. Hello= le texte à rechercher.- Deuxième
/= sépare le motif de recherche du remplacement. Hi= le texte de remplacement.- Troisième
/= termine le remplacement (aucun drapeau ne suit).
Cette commande remplace la première occurrence de "Hello" par "Hi" sur chaque ligne. Par défaut, sed ne remplace que la première correspondance de chaque ligne.
Note : Dans cet exemple, comme "Hello" n'apparaît qu'une seule fois par ligne, il semble que toutes les instances soient remplacées même sans le drapeau g.
Pour mieux comprendre l'effet du drapeau g, modifions sed_test.txt pour qu'il y ait plusieurs occurrences de "Hello" sur la même ligne :
echo -e "Hello, world. Hello everyone\nThis is a test\nHello, labex says Hello\nWorld of Linux" > sed_test.txt
Désormais, le contenu de sed_test.txt est :
Hello, world. Hello everyone
This is a test
Hello, labex says Hello
World of Linux
Exécutez à nouveau la commande de remplacement sans le drapeau g :
sed 's/Hello/Hi/' sed_test.txt
La sortie sera :
Hi, world. Hello everyone
This is a test
Hi, labex says Hello
World of Linux
Vous pouvez constater que seul le premier "Hello" de chaque ligne est remplacé.
Maintenant, effectuez un remplacement global en utilisant le drapeau g :
sed 's/Hello/Hi/g' sed_test.txt
La sortie sera :
Hi, world. Hi everyone
This is a test
Hi, labex says Hi
World of Linux
Cette fois, toutes les occurrences de "Hello" sur chaque ligne sont remplacées par "Hi".
Explication détaillée :
sed 's/Hello/Hi/': Remplace la première correspondance de "Hello" dans chaque ligne.- Structure :
s(substitution) +/Hello/(motif de recherche) +Hi/(remplacement). - Les trois caractères
/sont des délimiteurs, ils ne font pas partie du texte.
- Structure :
sed 's/Hello/Hi/g': Remplace toutes les correspondances de "Hello" dans chaque ligne.- Structure :
s(substitution) +/Hello/(motif de recherche) +Hi/(remplacement) +g(drapeau global). - Le drapeau
gsignifie "global", indiquant que la substitution doit être effectuée pour chaque occurrence dans la ligne.
- Structure :
Utilisation de délimiteurs alternatifs : Vous pouvez utiliser d'autres caractères comme délimiteurs si votre texte contient des barres obliques. Par exemple :
sed 's#/path/to/file#/new/path#g' filename
Ici, # est utilisé comme délimiteur au lieu de /, ce qui est très pratique pour manipuler des chemins de fichiers.
Notez que ces commandes ne modifient pas le fichier lui-même ; elles affichent seulement le texte modifié dans le terminal. Pour modifier le fichier directement, utilisez l'option -i :
sed -i 's/Hello/Hi/g' sed_test.txt
Vérifiez maintenant le contenu du fichier pour voir les changements :
cat sed_test.txt
Utilisation avancée de Sed
Maintenant que nous comprenons les bases de sed, explorons des fonctionnalités plus avancées qui en font un outil de manipulation de texte redoutable.
Supprimer des lignes :
sed '2d' sed_test.txtCela supprime la deuxième ligne du fichier. La commande
ddanssedsignifie "delete" (supprimer).Insérer du texte :
sed '1i\First line' sed_test.txtAnalyse de cette commande :
1= numéro de ligne (insérer avant la ligne 1).i= commande d'insertion (insert).\= terminateur de commande (ce n'est pas un délimiteur comme dans la substitution).First line= le texte à insérer.
Cela insère "First line" avant la première ligne du fichier.
Ajouter du texte en fin de ligne :
sed '$a\Last line' sed_test.txtAnalyse de cette commande :
$= représente la dernière ligne.a= commande d'ajout (append).\= terminateur de commande (signale la fin de la commande et le début du texte).Last line= le texte à ajouter.
Cela ajoute "Last line" à la toute fin du fichier.
Commandes multiples :
sed -e 's/Hi/Hello/g' -e 's/labex/LabEx/g' sed_test.txtCeci applique plusieurs substitutions en une seule commande. L'option
-epermet de spécifier plusieurs instructions sed.Utiliser des expressions régulières :
sed 's/[Ww]orld/Universe/g' sed_test.txtCeci utilise une expression régulière pour faire correspondre à la fois "World" et "world", en les remplaçant par "Universe".
Explication de la syntaxe des commandes :
2dsupprime la deuxième ligne. Vous pouvez changer le chiffre pour supprimer d'autres lignes.- Structure :
numéro_de_ligne+d(commande de suppression).
- Structure :
1i\insère du texte avant la première ligne.- Structure :
numéro_de_ligne+i(insertion) +\(terminateur) +texte. - Important : Le
\ici n'est PAS un délimiteur — c'est un terminateur qui sépare la commande du texte à insérer.
- Structure :
$a\ajoute du texte à la fin du fichier.- Structure :
$(dernière ligne) +a(ajout) +\(terminateur) +texte.
- Structure :
-epermet de combiner plusieurs commandes sed sur une seule ligne.[Ww]est une expression régulière qui correspond soit à un "W" majuscule, soit à un "w" minuscule.
Résumé de l'usage des délimiteurs dans sed :
- Commandes de substitution (
s) : Utilisez/comme délimiteurs :s/motif/remplacement/drapeaux. - Commandes d'insertion/ajout (
i/a) : Utilisez\comme terminateurs de commande :i\texteoua\texte. - Autres délimiteurs : Vous pouvez utiliser des caractères alternatifs comme
#,|, ou:dans les commandes de substitution.
Exercice pratique sur les délimiteurs :
Créons un fichier contenant des chemins pour voir les délimiteurs alternatifs en action :
echo -e "/home/user/documents\n/var/log/messages\n/etc/passwd" > paths.txt
Essayez maintenant de remplacer les chemins en utilisant différents délimiteurs :
## Utilisation de / comme délimiteur (peut être confus avec les chemins)
sed 's/\/home\/user/\/home\/newuser/g' paths.txt
## Utilisation de ## comme délimiteur (beaucoup plus clair pour les chemins)
sed 's#/home/user#/home/newuser#g' paths.txt
## Utilisation de | comme délimiteur (également très lisible)
sed 's|/home/user|/home/newuser|g' paths.txt
Les trois commandes produisent le même résultat, mais les deux dernières sont beaucoup plus faciles à lire lorsqu'on travaille avec des chemins de fichiers !
Essayez ces commandes et observez les résultats. N'oubliez pas que sans l'option -i, ces modifications ne sont pas enregistrées dans le fichier.
Introduction à Awk
awk est un outil de traitement de texte extrêmement puissant, particulièrement efficace pour manipuler des données structurées. Il traite chaque ligne d'entrée comme un enregistrement et chaque mot de cette ligne comme un champ. Commençons par quelques opérations de base.
Tout d'abord, créez un nouveau fichier avec des données structurées :
echo -e "Name Age Country\nAlice 25 USA\nBob 30 Canada\nCharlie 35 UK\nDavid 28 Australia" > awk_test.txt
Cela crée un fichier nommé awk_test.txt avec une ligne d'en-tête et quatre lignes de données.
Maintenant, utilisons awk pour afficher des champs spécifiques :
awk '{print $1}' awk_test.txt
Ceci affiche le premier champ (colonne) de chaque ligne. Dans awk, $1 fait référence au premier champ, $2 au second, et ainsi de suite. $0 fait référence à la ligne entière.
Pour afficher plusieurs champs :
awk '{print $1, $2}' awk_test.txt
Ceci affiche les premier et deuxième champs de chaque ligne.
Nous pouvons également utiliser des conditions :
awk '$2 > 28 {print $1 " is over 28"}' awk_test.txt
Ceci affiche les noms des personnes de plus de 28 ans.
Essayons quelque chose de plus complexe :
awk 'NR > 1 {sum += $2} END {print "Average age:", sum/(NR-1)}' awk_test.txt
Ceci calcule et affiche l'âge moyen, en ignorant la ligne d'en-tête.
Explications :
- Dans
awk, chaque ligne est automatiquement découpée en champs, généralement par des espaces ou des tabulations. $1,$2, etc., font référence aux champs respectifs de chaque ligne.NRest une variable intégrée qui représente le numéro de l'enregistrement (ligne) actuel.- Le bloc
ENDest exécuté une fois que toutes les lignes ont été traitées. sum += $2ajoute la valeur du deuxième champ (l'âge) à un total cumulé.
Essayez ces commandes et observez les résultats. awk est incroyablement performant pour les tâches de traitement de données.
Résumé
Dans cet atelier, vous avez appris les bases de trois commandes de traitement de texte incontournables sous Linux :
grep: Pour rechercher des motifs textuels à l'aide d'expressions régulières.sed: Pour l'édition de flux et la transformation de texte.awk: Pour le traitement de texte avancé et l'extraction de données.
En particulier, lors de l'utilisation de sed, nous avons approfondi l'effet du drapeau g. Sans ce drapeau, sed ne remplace que la première occurrence trouvée sur chaque ligne ; avec le drapeau g, il remplace toutes les occurrences de la ligne. En modifiant le fichier d'exemple pour inclure plusieurs correspondances sur une même ligne, nous avons pu observer clairement cet effet.
Ces outils sont essentiels pour tout utilisateur Linux ou administrateur système. Ils vous permettent de parcourir efficacement des fichiers, de modifier du texte et d'extraire des données spécifiques de fichiers texte structurés. À mesure que vous vous familiariserez avec ces commandes, vous découvrirez qu'elles peuvent simplifier considérablement de nombreuses tâches de traitement de texte dans votre travail quotidien.
N'oubliez pas que la pratique est la clé pour maîtriser ces outils. Essayez de les utiliser dans différents scénarios et consultez leurs pages de manuel (man grep, man sed, man awk) pour découvrir des fonctionnalités et des options plus avancées. Chacune de ces commandes possède bien plus de capacités que ce que nous avons abordé ici, et apprendre à les utiliser efficacement augmentera considérablement votre productivité.



