Linux Professional Institute Learning Logo.
Passer au contenu principal
  • Accueil
    • Toutes les ressources
    • Supports de Cours LPI
    • Devenez contributeur
    • Publishing Partners
    • Devenez Partenaire de Publication
    • À propos
    • FAQ
    • Contributeurs
    • Feuille de route
    • Contactez-nous
  • LPI.org
103.7 Leçon 2
Thème 101 : Architecture système
101.1 Détermination et configuration des paramètres du matériel
  • 101.1 Leçon 1
101.2 Démarrage du système
  • 101.2 Leçon 1
101.3 Change runlevels / boot targets and shutdown or reboot system
  • 101.3 Leçon 1
Thème 102 : Installation de Linux et gestion de paquetages
102.1 Conception du schéma de partitionnement
  • 102.1 Leçon 1
102.2 Installation d'un gestionnaire d'amorçage
  • 102.2 Leçon 1
102.3 Gestion des bibliothèques partagées
  • 102.3 Leçon 1
102.4 Utilisation du gestionnaire de paquetage Debian
  • 102.4 Leçon 1
102.5 Utilisation des gestionnaires de paquetage RPM et YUM
  • 102.5 Leçon 1
102.6 Linux en tant que système virtuel hébergé
  • 102.6 Leçon 1
Thème 103 : Commandes GNU et Unix
103.1 Travail en ligne de commande
  • 103.1 Leçon 1
  • 103.1 Leçon 2
103.2 Traitement de flux de type texte avec des filtres
  • 103.2 Leçon 1
103.3 Gestion élémentaire des fichiers
  • 103.3 Leçon 1
  • 103.3 Leçon 2
103.4 Utilisation des flux, des tubes et des redirections
  • 103.4 Leçon 1
  • 103.4 Leçon 2
103.5 Création, contrôle et interruption des processus
  • 103.5 Leçon 1
  • 103.5 Leçon 2
103.6 Modification des priorités des processus
  • 103.6 Leçon 1
103.7 Recherche dans des fichiers texte avec les expressions rationnelles
  • 103.7 Leçon 1
  • 103.7 Leçon 2
103.8 Édition de fichier simple
  • Prochainement...
Thème 104 : Disques, systèmes de fichiers Linux , arborescence de fichiers standard (FHS)
104.1 Création des partitions et des systèmes de fichiers
  • Prochainement...
104.2 Maintenance de l'intégrité des systèmes de fichiers
  • Prochainement...
104.3 Montage et démontage des systèmes de fichiers
  • Prochainement...
104.5 Gestion des permissions et de la propriété sur les fichiers
  • Prochainement...
104.6 Création et modification des liens physiques et symboliques sur les fichiers
  • Prochainement...
104.7 Recherche de fichiers et placement des fichiers aux endroits adéquats
  • Prochainement...
How to get certified
  1. Thème 103 : Commandes GNU et Unix
  2. 103.7 Recherche dans des fichiers texte avec les expressions rationnelles
  3. 103.7 Leçon 2

103.7 Leçon 2

Certification :

LPIC-1

Version :

5.0

Thème :

103 Commandes GNU et Unix

Objectif :

103.7 Recherche dans des fichiers texte avec les expressions régulières

Leçon :

2 sur 2

Introduction

La transmission de données par une chaîne de commandes groupées permet d’appliquer des filtres complexes basés sur les expressions régulières. Les expressions régulières sont une technique importante utilisée non seulement dans l’administration système, mais aussi dans l’exploration de données (data mining) et les domaines connexes. Deux commandes sont particulièrement adaptées à la manipulation de fichiers et de données textuelles à l’aide d’expressions régulières : grep et sed. grep est un outil de recherche de motifs et sed est un éditeur de flux. Ces commandes sont utiles en elles-mêmes, mais c’est surtout en travaillant avec d’autres processus qu’elles se distinguent.

La recherche de motifs : grep

L’une des utilisations les plus courantes de grep consiste à faciliter l’inspection de fichiers longs, en utilisant l’expression régulière comme filtre appliqué à chaque ligne. On peut l’utiliser pour n’afficher que les lignes commençant par un certain terme. Par exemple, grep peut être utilisé pour examiner un fichier de configuration pour les modules du noyau, en n’affichant que les lignes relatives aux options :

$ grep '^options' /etc/modprobe.d/alsa-base.conf
options snd-pcsp index=-2
options snd-usb-audio index=-2
options bt87x index=-2
options cx88_alsa index=-2
options snd-atiixp-modem index=-2
options snd-intel8x0m index=-2
options snd-via82xx-modem index=-2

Le symbole pipe | peut être utilisé pour rediriger la sortie d’une commande directement vers l’entrée de grep. L’exemple suivant utilise une expression régulière entre crochets pour sélectionner les lignes de la sortie de fdisk -l qui commencent par Disk /dev/sda ou Disk /dev/sdb :

# fdisk -l | grep '^Disk /dev/sd[ab]'
Disk /dev/sda: 320.1 GB, 320072933376 bytes, 625142448 sectors
Disk /dev/sdb: 7998 MB, 7998537728 bytes, 15622144 sectors

La simple sélection des lignes avec des correspondances peut être inadaptée à une tâche particulière, ce qui nécessite d’ajuster le comportement de grep par le biais de ses options. Par exemple, l’option -c ou --count demande à grep d’afficher le nombre de lignes avec des correspondances :

# fdisk -l | grep '^Disk /dev/sd[ab]' -c
2

L’option peut être placée avant ou après l’expression régulière. Voici d’autres options importantes de grep :

-c ou --count

Au lieu d’afficher les résultats de la recherche, afficher uniquement le nombre total de correspondances dans un fichier donné.

-i ou --ignore-case

Rendre la recherche insensible à la casse.

-f FILE ou --file=FILE

Indiquer un fichier qui contient l’expression régulière à utiliser.

-n ou --line-number

Indiquer le numéro de la ligne.

-v ou --invert-match

Sélectionner toutes les lignes sauf celles qui contiennent des correspondances.

-H ou --with-filename

Afficher également le nom du fichier qui contient la ligne.

-z ou --null-data

Plutôt que de demander à grep de traiter les flux de données d’entrée et de sortie comme des lignes séparées (en utilisant le retour à la ligne par défaut), il faut considérer l’entrée ou la sortie comme une séquence de lignes. Lorsque l’on combine la sortie de la commande find en utilisant son option -print0 avec la commande grep, l’option -z ou --null-data devra être utilisée pour traiter le flux de la même manière.

Bien qu’activée par défaut lorsque plusieurs chemins de fichiers sont fournis en entrée, l’option -H n’est pas activée pour les fichiers individuels. Cela peut s’avérer critique dans certaines situations, comme lorsque grep est appelé directement par find, par exemple :

$ find /usr/share/doc -type f -exec grep -i '3d modeling' "{}" \; | cut -c -100
artistic aspects of 3D modeling. Thus this might be the application you are
This major approach of 3D modeling has not been supported
oce is a C++ 3D modeling library. It can be used to develop CAD/CAM softwares, for instance [FreeCad

Dans cet exemple, find affiche tous les fichiers sous /usr/share/doc et transmet chacun à grep, qui effectue à son tour une recherche insensible à la casse du terme 3d modeling à l’intérieur de chaque fichier. Le transfert de données vers cut sert uniquement à limiter la longueur de la sortie à 100 colonnes. Notez cependant qu’il n’y a aucun moyen de savoir de quel fichier proviennent les lignes en question. Ce problème est résolu en ajoutant l’option -H à grep :

$ find /usr/share/doc -type f -exec grep -i -H '3d modeling' "{}" \; | cut -c -100
/usr/share/doc/openscad/README.md:artistic aspects of 3D modeling. Thus this might be the applicatio
/usr/share/doc/opencsg/doc/publications.html:This major approach of 3D modeling has not been support

À présent, on peut identifier les fichiers dans lesquels chaque correspondance a été trouvée. Pour rendre la liste encore plus parlante, les lignes qui précèdent et qui suivent peuvent être ajoutées aux lignes contenant des correspondances :

$ find /usr/share/doc -type f -exec grep -i -H -1 '3d modeling' "{}" \; | cut -c -100
/usr/share/doc/openscad/README.md-application Blender), OpenSCAD focuses on the CAD aspects rather t
/usr/share/doc/openscad/README.md:artistic aspects of 3D modeling. Thus this might be the applicatio
/usr/share/doc/openscad/README.md-looking for when you are planning to create 3D models of machine p
/usr/share/doc/opencsg/doc/publications.html-3D graphics library for Constructive Solid Geometry (CS
/usr/share/doc/opencsg/doc/publications.html:This major approach of 3D modeling has not been support
/usr/share/doc/opencsg/doc/publications.html-by real-time computer graphics until recently.

L’option -1 demande à grep d’inclure une ligne avant et une ligne après lorsqu’il trouve une ligne avec une correspondance. Ces lignes supplémentaires sont appelées lignes contextuelles. Elles sont identifiées dans la sortie par un signe moins après le nom du fichier. Le même résultat peut être obtenu avec -C 1 ou --context=1. D’autres quantités de lignes de contexte peuvent être indiquées.

Il existe deux programmes complémentaires à grep : egrep et fgrep. Le programme egrep est équivalent à la commande grep -E, qui incorpore des fonctionnalités supplémentaires autres que les expressions régulières de base. Par exemple, avec egrep il est possible d’utiliser des expressions régulières étendues, comme les branches :

$ find /usr/share/doc -type f -exec egrep -i -H -1 '3d (modeling|printing)' "{}" \; | cut -c -100
/usr/share/doc/openscad/README.md-application Blender), OpenSCAD focuses on the CAD aspects rather t
/usr/share/doc/openscad/README.md:artistic aspects of 3D modeling. Thus this might be the applicatio
/usr/share/doc/openscad/README.md-looking for when you are planning to create 3D models of machine p
/usr/share/doc/openscad/RELEASE_NOTES.md-* Support for using 3D-Mouse / Joystick / Gamepad input dev
/usr/share/doc/openscad/RELEASE_NOTES.md:* 3D Printing support: Purchase from a print service partne
/usr/share/doc/openscad/RELEASE_NOTES.md-* New export file formats: SVG, 3MF, AMF
/usr/share/doc/opencsg/doc/publications.html-3D graphics library for Constructive Solid Geometry (CS
/usr/share/doc/opencsg/doc/publications.html:This major approach of 3D modeling has not been support
/usr/share/doc/opencsg/doc/publications.html-by real-time computer graphics until recently.

Dans cet exemple, soit 3D modeling soit 3D printing correspondra à l’expression, sans tenir compte des majuscules et des minuscules. Pour afficher les seules parties d’un flux de texte qui correspondent à l’expression utilisée par egrep, utilisez l’option -o.

Le programme fgrep est équivalent à grep -F, c’est-à-dire qu’il ne tient pas compte des expressions régulières. Il est utile dans les recherches simples où le but est de trouver une expression littérale. Dans ce cas, les caractères spéciaux tels que le signe du dollar et le point seront considérés au pied de la lettre et non pas en fonction de leur signification dans une expression régulière.

L’éditeur de flux : sed

Le programme sed sert à modifier des données textuelles de façon non interactive. Cela signifie que tout le travail d’édition est effectué à partir d’un jeu d’instructions prédéfinies, et non pas en tapant arbitrairement et directement dans un texte affiché à l’écran. En termes modernes, sed peut être compris comme un analyseur de motifs : lorsqu’un texte est fourni en entrée, il insère un contenu spécifique à des positions prédéfinies ou lorsqu’il trouve une correspondance pour une expression régulière.

Sed, comme son nom le suggère, est parfaitement adapté à l’édition de texte à travers des flux de données (pipelines). Sa syntaxe de base est sed -f SCRIPT lorsque les instructions d’édition sont stockées dans le fichier SCRIPT ou sed -e COMMANDS pour exécuter COMMANDS directement depuis la ligne de commande. En l’absence de -f ou de -e, sed utilise le premier paramètre non optionnel comme fichier de script. Il est également possible d’utiliser un fichier en entrée en fournissant son chemin comme argument à sed.

Les instructions sed sont composées d’un seul caractère, qui peut être précédé d’une adresse ou suivi d’une ou plusieurs options. Elles sont appliquées successivement à chaque ligne. Les adresses peuvent être un numéro de ligne unique, une expression régulière ou une plage de lignes. Par exemple, la première ligne d’un flux de texte peut être supprimée avec 1d, où 1 spécifie la ligne où la commande de suppression d sera appliquée. Pour illustrer l’utilisation de sed, prenons le résultat de la commande factor `seq 12`, qui renvoie les facteurs premiers des nombres de 1 à 12 :

$ factor `seq 12`
1:
2: 2
3: 3
4: 2 2
5: 5
6: 2 3
7: 7
8: 2 2 2
9: 3 3
10: 2 5
11: 11
12: 2 2 3

La suppression de la première ligne avec sed est effectuée par 1d :

$ factor `seq 12` | sed 1d
2: 2
3: 3
4: 2 2
5: 5
6: 2 3
7: 7
8: 2 2 2
9: 3 3
10: 2 5
11: 11
12: 2 2 3

Une série de lignes peut être spécifiée avec une virgule de séparation :

$ factor `seq 12` | sed 1,7d
8: 2 2 2
9: 3 3
10: 2 5
11: 11
12: 2 2 3

On peut utiliser plus d’une instruction dans la même exécution, en les séparant par des points-virgules. Cependant, il est important dans ce cas de les entourer de guillemets pour éviter que le point-virgule ne soit interprété par le shell :

$ factor `seq 12` | sed "1,7d;11d"
8: 2 2 2
9: 3 3
10: 2 5
12: 2 2 3

Dans cet exemple, deux instructions de suppression ont été exécutées, d’abord pour les lignes allant de 1 à 7, puis pour la ligne 11. Une adresse peut également être une expression régulière, de sorte que seules les lignes qui correspondent à cette expression seront affectées par l’instruction :

$ factor `seq 12` | sed "1d;/:.*2.*/d"
3: 3
5: 5
7: 7
9: 3 3
11: 11

L’expression régulière :.*2.* correspond à toute occurrence du nombre 2 n’importe où après un deux-points, ce qui entraîne la suppression des lignes correspondant à des nombres avec le facteur 2. Avec sed, tout ce qui est placé entre les barres obliques (/) est considéré comme une expression régulière et, par défaut, toutes les expressions régulières de base sont supportées. Par exemple, sed -e "/^#/d" /etc/services affiche le contenu du fichier /etc/services sans les lignes qui commencent par # (lignes de commentaires).

L’instruction de suppression d fait partie de la multitude d’instructions d’édition fournies par sed. Au lieu de supprimer une ligne, sed peut la remplacer par un texte donné :

$ factor `seq 12` | sed "1d;/:.*2.*/c REMOVED"
REMOVED
3: 3
REMOVED
5: 5
REMOVED
7: 7
REMOVED
9: 3 3
REMOVED
11: 11
REMOVED

L’instruction c REMOVED remplace simplement une ligne par le texte REMOVED. Dans notre exemple, chaque ligne dont une partie correspond à l’expression régulière :.*2.* est affectée par l’instruction c REMOVED. L’instruction a TEXT copie le texte indiqué par TEXT sur une nouvelle ligne après la ligne avec une correspondance. L’instruction r FILE fait la même chose, mais en copiant le contenu du fichier indiqué par FILE. L’instruction w fait le contraire de r, c’est-à-dire que la ligne sera ajoutée au fichier indiqué.

L’instruction sed la plus populaire est certainement s/FIND/REPLACE/. Elle sert à remplacer une correspondance à l’expression régulière FIND par le texte indiqué par REPLACE. Par exemple, l’instruction s/hda/sda/ remplace une chaîne de caractères correspondant à l’expression régulière hda par sda. Seule la première correspondance trouvée dans la ligne sera remplacée, à moins que l’indicateur g ne soit placé après l’instruction, comme dans s/hda/sda/g.

Une étude de cas plus concrète permettra d’illustrer les fonctionnalités de sed. Admettons qu’une clinique veuille envoyer des textos à ses clients pour leur rappeler leur rendez-vous du lendemain. Un scénario typique s’appuie sur un service professionnel de messagerie instantanée, qui fournit une API permettant d’accéder au système chargé de transmettre les messages. Ces messages proviennent généralement du même système que celui qui exécute l’application contrôlant les rendez-vous des clients, et ils sont déclenchés à une heure précise de la journée ou à la suite d’un autre événement. Dans cette situation hypothétique, l’application pourrait générer un fichier appelé appointments.csv contenant des données sous forme de tableau avec tous les rendez-vous pour le lendemain, puis utilisé par sed pour générer les messages texte à partir d’un fichier modèle appelé template.txt. Les fichiers CSV sont un outil standard pour exporter des données à partir d’une base de données, de sorte que des exemples de rendez-vous peuvent être présentés comme suit :

$ cat appointments.csv
"NAME","TIME","PHONE"
"Carol","11am","55557777"
"Dave","2pm","33334444"

La première ligne contient les intitulés de chaque colonne, qui serviront à faire correspondre les balises du fichier modèle :

$ cat template.txt
Hey <NAME>, don't forget your appointment tomorrow at <TIME>.

Les signes inférieur à < et supérieur à > ont été placés autour des titres pour les identifier comme des balises. Le script Bash ci-dessous analyse tous les rendez-vous en file d’attente en utilisant template.txt comme modèle de message :

#! /bin/bash

TEMPLATE=`cat template.txt`
TAGS=(`sed -ne '1s/^"//;1s/","/\n/g;1s/"$//p' appointments.csv`)
mapfile -t -s 1 ROWS < appointments.csv
for (( r = 0; r < ${#ROWS[*]}; r++ ))
do
  MSG=$TEMPLATE
  VALS=(`sed -e 's/^"//;s/","/\n/g;s/"$//' <<<${ROWS[$r]}`)
  for (( c = 0; c < ${#TAGS[*]}; c++ ))
  do
    MSG=`sed -e "s/<${TAGS[$c]}>/${VALS[$c]}/g" <<<"$MSG"`
  done
  echo curl --data message=\"$MSG\" --data phone=\"${VALS[2]}\" https://mysmsprovider/api
done

Un véritable script de production devrait également gérer l’authentification, la vérification des erreurs et la journalisation, mais l’exemple comporte des fonctionnalités de base pour le moment. Les premières instructions exécutées par sed ne sont appliquées qu’à la première ligne — l’adresse 1 dans 1s/^"//;1s/","/\n/g;1s/"$//p — pour supprimer les guillemets de début et de fin — 1s/^"// et 1s/"$// — et pour remplacer les séparateurs de champs par un caractère de retour à la ligne : 1s/","/\n/g. Seule la première ligne est nécessaire pour charger les noms des colonnes, et les lignes non correspondantes seront supprimées par l’option -n, ce qui nécessite que l’indicateur p soit placé après la dernière commande sed pour afficher la ligne correspondante. Les balises sont alors stockées dans la variable TAGS sous forme de matrice Bash. Une autre matrice Bash est créée par la commande mapfile pour stocker les lignes qui contiennent les rendez-vous dans la matrice ROWS.

Une boucle for est mise en place pour traiter chaque ligne de rendez-vous trouvée dans ROWS. Ensuite, les guillemets et les séparateurs dans le rendez-vous - le rendez-vous figure dans la variable ${ROWS[$r]} utilisée comme un here string - sont remplacés par sed, de la même manière que les commandes utilisées pour charger les balises. Les valeurs séparées du rendez-vous sont alors stockées dans la matrice VALS, où les indices 0, 1 et 2 correspondent aux valeurs de NAME, TIME et PHONE.

Enfin, une boucle for imbriquée traverse la matrice TAGS et remplace chaque balise trouvée dans le modèle par sa valeur correspondante dans VALS. La variable MSG contient une copie du modèle affiché, mise à jour par la commande de substitution s/<${TAGS[$c]}>/${VALS[$c]}/g à chaque passage de la boucle dans TAGS.

Il en résulte un message du type : "Hey Carol, don’t forget your appointment tomorrow at 11am." Le message généré peut alors être envoyé sous forme de paramètre dans une requête HTTP avec curl, en tant que message e-mail ou n’importe quelle autre méthode similaire.

Combiner grep et sed

Les commandes grep et sed peuvent être utilisées conjointement lorsque des procédures d’exploration de texte plus complexes s’avèrent nécessaires. En tant qu’administrateur système, vous pouvez être amené à inspecter toutes les tentatives de connexion à un serveur, par exemple. Le fichier /var/log/wtmp enregistre toutes les connexions et déconnexions, tandis que le fichier /var/log/btmp enregistre les tentatives de connexion échouées. Ces données sont écrites dans un format binaire, qui peut être lu respectivement avec les commandes last et lastb.

La sortie de lastb affiche non seulement le nom d’utilisateur utilisé dans la tentative de connexion échouée, mais aussi son adresse IP :

# lastb -d -a -n 10 --time-format notime
user     ssh:notty       (00:00)     81.161.63.251
nrostagn ssh:notty       (00:00)     vmd60532.contaboserver.net
pi       ssh:notty       (00:00)     132.red-88-20-39.staticip.rima-tde.net
pi       ssh:notty       (00:00)     132.red-88-20-39.staticip.rima-tde.net
pi       ssh:notty       (00:00)     46.6.11.56
pi       ssh:notty       (00:00)     46.6.11.56
nps      ssh:notty       (00:00)     vmd60532.contaboserver.net
narmadan ssh:notty       (00:00)     vmd60532.contaboserver.net
nominati ssh:notty       (00:00)     vmd60532.contaboserver.net
nominati ssh:notty       (00:00)     vmd60532.contaboserver.net

L’option -d traduit l’adresse IP en nom d’hôte correspondant. Le nom d’hôte peut fournir des indices sur le fournisseur d’accès ou le service d’hébergement utilisé pour effectuer ces tentatives de connexion douteuses. L’option -a affiche le nom d’hôte dans la dernière colonne, ce qui facilite le filtrage à appliquer. L’option --time-format notime supprime l’heure à laquelle la tentative de connexion a eu lieu. La commande lastb peut mettre un certain temps à se terminer s’il y a eu trop de tentatives de connexion erronées, c’est pourquoi l’affichage a été limité à dix entrées avec l’option -n 10.

Toutes les adresses IP distantes ne sont pas associées à un nom d’hôte, de sorte que le reverse DNS ne les concerne pas et qu’elles peuvent être ignorées. Même s’il est possible de rédiger une expression régulière qui correspondrait au format attendu pour un nom d’hôte en fin de ligne, il est probablement plus simple d’écrire une regex qui correspond soit à une lettre de l’alphabet, soit à un seul chiffre en fin de ligne. L’exemple ci-dessous montre comment la commande grep récupère la liste sur l’entrée standard et supprime les lignes qui ne contiennent pas de nom d’hôte :

# lastb -d -a --time-format notime | grep -v '[0-9]$' | head -n 10
nvidia   ssh:notty       (00:00)     vmd60532.contaboserver.net
n_tonson ssh:notty       (00:00)     vmd60532.contaboserver.net
nrostagn ssh:notty       (00:00)     vmd60532.contaboserver.net
pi       ssh:notty       (00:00)     132.red-88-20-39.staticip.rima-tde.net
pi       ssh:notty       (00:00)     132.red-88-20-39.staticip.rima-tde.net
nps      ssh:notty       (00:00)     vmd60532.contaboserver.net
narmadan ssh:notty       (00:00)     vmd60532.contaboserver.net
nominati ssh:notty       (00:00)     vmd60532.contaboserver.net
nominati ssh:notty       (00:00)     vmd60532.contaboserver.net
nominati ssh:notty       (00:00)     vmd60532.contaboserver.net

La commande grep avec l’option -v n’affiche que les lignes qui ne correspondent pas à l’expression régulière donnée. Une expression régulière correspondant à toute ligne se terminant par un chiffre (c’est-à-dire [0-9]$) ne retiendra que les entrées sans nom d’hôte. Par conséquent, grep -v '[0-9]$' n’affichera que les lignes qui se terminent par un nom d’hôte.

Le résultat peut être filtré encore davantage, en ne gardant que le nom de domaine et en supprimant les autres parties de chaque ligne. La commande sed peut le faire avec une commande de substitution pour remplacer la ligne entière par une référence au nom de domaine :

# lastb -d -a --time-format notime | grep -v '[0-9]$' | sed -e 's/.* \(.*\)$/\1/' | head -n 10
vmd60532.contaboserver.net
vmd60532.contaboserver.net
vmd60532.contaboserver.net
132.red-88-20-39.staticip.rima-tde.net
132.red-88-20-39.staticip.rima-tde.net
vmd60532.contaboserver.net
vmd60532.contaboserver.net
vmd60532.contaboserver.net
vmd60532.contaboserver.net
vmd60532.contaboserver.net

La parenthèse échappée dans .* \(.*\)$ indique à sed de se souvenir de cette partie de la ligne, c’est-à-dire la partie entre le dernier caractère d’espacement et la fin de la ligne. Dans l’exemple, cette partie est référencée avec \1 et utilisée pour remplacer la ligne entière.

Il est clair que la plupart des hôtes distants essaient de se connecter plus d’une fois, ce qui fait que le même nom de domaine se répète. Pour supprimer les entrées récurrentes, il faut d’abord les trier (avec la commande sort) puis les passer à la commande uniq :

# lastb -d -a --time-format notime | grep -v '[0-9]$' | sed -e 's/.* \(.*\)$/\1/' | sort | uniq | head -n 10
116-25-254-113-on-nets.com
132.red-88-20-39.staticip.rima-tde.net
145-40-33-205.power-speed.at
tor.laquadrature.net
tor.momx.site
ua-83-226-233-154.bbcust.telenor.se
vmd38161.contaboserver.net
vmd60532.contaboserver.net
vmi488063.contaboserver.net
vmi515749.contaboserver.net

On voit ainsi comment il est possible de combiner une série de commandes pour obtenir le résultat voulu. La liste des noms d’hôtes pourra ensuite être utilisée pour rédiger des règles de pare-feu ou pour prendre d’autres mesures destinées à renforcer la sécurité du serveur.

Exercices guidés

  1. La commande last affiche une liste des derniers utilisateurs connectés, y compris leurs adresses IP d’origine. Comment pourrait-on utiliser la commande egrep pour filtrer les résultats de last, en affichant uniquement les occurrences d’une adresse IPv4, et en supprimant toute information supplémentaire dans la ligne correspondante ?

  2. Quelle option doit être utilisée avec grep pour filtrer correctement la sortie générée par la commande find exécutée avec l’option -print0 ?

  3. La commande uptime -s affiche la dernière date à laquelle le système a été démarré, comme dans 2019-08-05 20:13:22. Quel sera le résultat de la commande uptime -s | sed -e 's/(.*) (.*)/\1/' ?

  4. Quelle option doit être passée à grep pour qu’il compte les lignes correspondantes au lieu de les afficher ?

Exercices d’approfondissement

  1. La structure de base d’un fichier HTML commence par les éléments html, head et body, par exemple :

    <html>
    <head>
      <title>Site d'actualités</title>
    </head>
    <body>
      <h1>À la une</h1>
      <p>Informations intéressantes.</p>
    </body>
    </html>

    Décrivez comment les adresses pourraient être utilisées dans sed pour afficher uniquement l’élément body et son contenu.

  2. Quelle expression sed supprimera toutes les balises d’un document HTML, en conservant uniquement le texte rendu ?

  3. Les fichiers avec l’extension .ovpn sont très utilisés pour configurer les clients VPN étant donné qu’ils contiennent non seulement les paramètres, mais aussi le contenu des clés et des certificats pour le client. Ces clés et certificats se trouvent à l’origine dans des fichiers séparés, et doivent donc être copiés dans le fichier .ovpn. Voici un extrait d’un gabarit .ovpn :

    client
    dev tun
    remote 192.168.1.155 1194
    <ca>
    ca.crt
    </ca>
    <cert>
    client.crt
    </cert>
    <key>
    client.key
    </key>
    <tls-auth>
    ta.key
    </tls-auth>

    En partant du fait que les fichiers ca.crt, client.crt, client.key et ta.key se trouvent dans le répertoire courant, comment la configuration du gabarit pourrait-elle être modifiée par sed de manière à remplacer chaque nom de fichier par son contenu ?

Résumé

Cette leçon présente les deux commandes Linux les plus importantes en rapport avec les expressions régulières : grep et sed. Les scripts et les commandes combinées s’appuient sur grep et sed pour effectuer toute une série de tâches de filtrage et d’analyse de texte. Voici les étapes de la leçon :

  • Comment utiliser grep et ses déclinaisons comme egrep et fgrep.

  • Comment utiliser sed et ses instructions internes pour manipuler du texte.

  • Exemples pratiques d’expressions régulières qui utilisent grep et sed.

Réponses aux exercices guidés

  1. La commande last affiche une liste des derniers utilisateurs connectés, y compris leurs adresses IP d’origine. Comment pourrait-on utiliser la commande egrep pour filtrer les résultats de last, en affichant uniquement les occurrences d’une adresse IPv4, et en supprimant toute information supplémentaire dans la ligne correspondante ?

    last -i | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

  2. Quelle option doit être utilisée avec grep pour filtrer correctement la sortie générée par la commande find exécutée avec l’option -print0 ?

    L’option -z ou --null-data, comme dans find . -print0 | grep -z expression.

  3. La commande uptime -s affiche la dernière date à laquelle le système a été démarré, comme dans 2019-08-05 20:13:22. Quel sera le résultat de la commande uptime -s | sed -e 's/(.*) (.*)/\1/' ?

    Une erreur se produira. Par défaut, les parenthèses doivent être échappées pour utiliser les références inverses dans sed.

  4. Quelle option doit être passée à grep pour qu’il compte les lignes correspondantes au lieu de les afficher ?

    L’option -c.

Réponses aux exercices d’approfondissement

  1. La structure de base d’un fichier HTML commence par les éléments html, head et body, par exemple :

    <html>
    <head>
      <title>Site d'actualités</title>
    </head>
    <body>
      <h1>À la une</h1>
      <p>Informations intéressantes.</p>
    </body>
    </html>

    Décrivez comment les adresses pourraient être utilisées dans sed pour afficher uniquement l’élément body et son contenu.

    Pour n’afficher que le body, les adresses doivent être /<body>/,/<\/body>/, comme dans sed -n -e '/<body>/,/<\/body>/p'. L’option -n est fournie à sed pour qu’il n’affiche pas les lignes par défaut, d’où la commande p à la fin de l’expression sed pour afficher les lignes correspondantes.

  2. Quelle expression sed supprimera toutes les balises d’un document HTML, en conservant uniquement le texte rendu ?

    L’expression sed s/<[^>]*>//g remplacera tout contenu inclus dans <> par une chaîne de caractères vide.

  3. Les fichiers avec l’extension .ovpn sont très utilisés pour configurer les clients VPN étant donné qu’ils contiennent non seulement les paramètres, mais aussi le contenu des clés et des certificats pour le client. Ces clés et certificats se trouvent à l’origine dans des fichiers séparés, et doivent donc être copiés dans le fichier .ovpn. Voici un extrait d’un gabarit .ovpn :

    client
    dev tun
    remote 192.168.1.155 1194
    <ca>
    ca.crt
    </ca>
    <cert>
    client.crt
    </cert>
    <key>
    client.key
    </key>
    <tls-auth>
    ta.key
    </tls-auth>

    En partant du fait que les fichiers ca.crt, client.crt, client.key et ta.key se trouvent dans le répertoire courant, comment la configuration du gabarit pourrait-elle être modifiée par sed de manière à remplacer chaque nom de fichier par son contenu ?

    La commande

    sed -r -e 's/(^[^.]*)\.(crt|key)$/cat \1.\2/e' < client.template > client.ovpn

    remplace chaque ligne qui se termine par .crt ou .key par le contenu d’un fichier dont le nom est identique à la ligne. L’option -r indique à sed d’utiliser des expressions régulières étendues, tandis que e à la fin de l’expression indique à sed de remplacer les correspondances par la sortie de la commande cat \1.\2. Les références inverses \1 et \2 correspondent au nom du fichier et à l’extension trouvés dans la correspondance.

Linux Professional Insitute Inc. Tous droits réservés. Visitez le site web du projet _Learning_ : https://learning.lpi.org
Ce travail est sous licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Pas de Modification 4.0 International.

Linux Professional Insitute Inc. Tous droits réservés. Visitez le site web du projet _Learning_ : https://learning.lpi.org
Ce travail est sous licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Pas de Modification 4.0 International.

LPI est une organisation à but non lucratif.

© 2023 Le Linux Professional Institute (LPI) est la référence mondiale en matière de certification et un organisme de soutien aux professionnels de l'Open Source. Avec plus de 200 000 certifiés à son actif, c'est le principal organisme de certification indépendant pour Linux et l'Open Source au monde. Le LPI a certifié des professionnels dans plus de 180 pays, organise des examens en plusieurs langues et compte des centaines de partenaires pour la formation.

Notre objectif est la création d'opportunités économiques et créatives pour tous en rendant accessible au monde entier la certification des connaissances et des compétences en matière d'Open Source.

  • LinkedIn
  • flogo-RGB-HEX-Blk-58 Facebook
  • Twitter
  • Contactez-nous
  • Politique en matière de confidentialité et de cookies

Vous avez repéré une erreur ou vous voulez aider à améliorer cette page ? Faites-nous savoir.

© 1999–2023 The Linux Professional Institute Inc. Tous droits réservés.