Retour au cours

regex grep

Objectifs

  • Rechercher un motif simple dans un fichier ou une sortie de commande avec grep.
  • Utiliser les options les plus courantes de grep (-i, -v, -c, -r, -E).
  • Comprendre les bases des expressions régulières (regex) pour des recherches plus puissantes.
  • Filtrer efficacement du texte en utilisant des ancrages (^, $) et des classes de caractères.

Explications détaillées

Notions clés

grep : Le couteau suisse de la recherche

grep (Global Regular Expression Print) est un outil fondamental qui lit du texte (depuis un fichier ou l’entrée standard) et affiche les lignes qui correspondent à un motif donné.

grep "mon_motif" mon_fichier.txt

Les options indispensables

  • -i : Ignore case. Ignore la différence entre majuscules et minuscules.
  • -v : Invert match. Affiche toutes les lignes qui ne correspondent pas au motif.
  • -c : Count. N’affiche pas les lignes, mais seulement le nombre de lignes qui correspondent.
  • -r ou -R : Recursive. Recherche dans tous les fichiers d’un dossier et de ses sous-dossiers.
  • -l : List files. Affiche seulement le nom des fichiers qui contiennent le motif.
  • -E : Extended regex. Active les expressions régulières étendues, ce qui simplifie la syntaxe pour certains opérateurs. C’est l’équivalent de l’ancienne commande egrep.

Introduction aux Expressions Régulières (Regex)

Une expression régulière est un “mini-langage” pour décrire des motifs de recherche. Voici les bases :

  • . (point) : Représente n’importe quel caractère unique. a.c correspond à aac, abc, axc, etc.
  • * (astérisque) : L’élément précédent peut apparaître zéro ou plusieurs fois. a* correspond à “, a, aa, aaa
  • ^ (accent circonflexe) : Début de la ligne. ^Bonjour ne correspond qu’aux lignes qui commencent par “Bonjour”.
  • $ (dollar) : Fin de la ligne. fin$ ne correspond qu’aux lignes qui se terminent par “fin”.
  • [] (crochets) : Classe de caractères. Correspond à un des caractères listés.
    • [abc] : a, b, ou c.
    • [0-9] : n’importe quel chiffre.
    • [^0-9] : tout ce qui n’est pas un chiffre.
  • \ (backslash) : Échappe un caractère spécial. \. correspond à un point littéral.

Avec l’option -E (egrep), la syntaxe est plus riche :

  • + : Une ou plusieurs fois l’élément précédent. a+ correspond à a, aa, etc., mais pas à une chaîne vide.
  • ? : Zéro ou une fois. colou?r correspond à color et colour.
  • | : OU logique. (chat|chien) correspond à “chat” ou “chien”.

Syntaxe / Usages

# Chercher un mot dans un fichier, insensible à la casse
grep -i "erreur" /var/log/syslog

# Compter le nombre de fois où l'utilisateur 'admin' est mentionné
grep -c "admin" logs.txt

# Lister tous les fichiers de configuration contenant l'adresse IP '192.168.1.1'
grep -r -l "192.168.1.1" /etc/

# Afficher les lignes qui NE commencent PAS par un commentaire '#'
grep -v "^#" config.conf

# Chercher les mots "error" ou "warning" (avec regex étendues)
grep -E "error|warning" application.log

Exemples

# Créez un fichier de test 'data.txt'
printf "pomme\npoire\nbanane\nPoMme Verte\n" > data.txt

# 1. Recherche simple
grep "poire" data.txt
# -> poire

# 2. Recherche insensible à la casse
grep -i "pomme" data.txt
# -> pomme
# -> PoMme Verte

# 3. Lignes ne contenant pas "po"
grep -v "po" data.txt
# -> banane

# 4. Lignes commençant par "p"
grep "^p" data.txt
# -> pomme
# -> poire

# 5. Combiner avec un pipe
# Lister les processus et ne garder que ceux liés à 'bash'
ps aux | grep "bash"

Bonnes pratiques

  • Toujours mettre le motif entre guillemets. Cela empêche le shell d’interpréter les caractères spéciaux (*, $, etc.) avant de les passer à grep.
  • Utilisez grep -E (ou egrep) par défaut. La syntaxe des expressions régulières étendues est plus intuitive et puissante.
  • Commencez avec un motif simple et affinez-le progressivement. La maîtrise des regex vient avec la pratique.

Pièges courants

  • Le motif est trop large : grep "user" trouvera aussi superuser. Pour un mot exact, utilisez -w (grep -w "user") ou des ancrages de mots (grep "\\<user\\>").
  • Oublier d’échapper les caractères spéciaux : Pour chercher un point littéral, il faut utiliser \.. Sinon, . correspondra à n’importe quel caractère.
  • Confondre les syntaxes Regex : Certains opérateurs comme + ou ? n’ont pas de signification spéciale en regex de base (sans -E) à moins d’être échappés (\+, \?), ce qui est source de confusion.

Exercices

  1. Filtrage de logs :

    • Créez un fichier mon.log avec quelques lignes, dont certaines contenant INFO, WARN, et ERROR.
    • Écrivez une commande pour afficher uniquement les lignes contenant ERROR.
    • Écrivez une commande pour compter le nombre de lignes contenant WARN.
  2. Recherche dans le système :

    • Utilisez grep pour trouver la ligne contenant votre nom d’utilisateur dans le fichier /etc/passwd.
    • Utilisez grep pour lister tous les fichiers dans /etc/ qui contiennent le mot network (insensible à la casse).
  3. Expression régulière :

    • Créez un fichier avec les lignes suivantes : test.txt, image.jpg, test.log, photo.jpeg.
    • Écrivez une commande grep -E qui n’affiche que les lignes correspondant à des images (.jpg ou .jpeg).