Utilisation de grep dans le Shell

Pourquoi utiliser grep ?

L'outil grep (Global Regular Expression Print) est un utilitaire standard pour la recherche de texte. Il analyse des fichiers ou des flux d'entrées pour identifier des lignes correspondant à un motif donné, souvent défini par une expression régulière, et affiche les résultats.

Exemples d'utilisation courante

  • grep 'erreur' journal.log : Recherche les lignes contenant "erreur" dans le fichier journal.log.
  • grep -i 'test' donnees.txt : Recherche insensible à la casse du mot "test".
  • grep -R "config" /home/utilisateur : Recherche récursive dans un répertoire et ses sous-répertoires.
  • grep -c 'succes' rapport.csv : Compte le nombre de lignes contenant "succes".

Syntaxe de base sous Linux/Unix

grep 'modele' fichier
grep 'modele' fichier1 fichier2
grep 'chaine1 chaine2' fichier
cat fichier | grep 'donnees'
commande | grep 'filtre'
grep --color 'motif' fichier

Recherche simple dans les fichiers

Pour chercher le terme "administrateur" dans le fichier des utilisateurs :

grep administrateur /etc/passwd

Recherche insensible à la casse :

grep -i "administrateur" /etc/passwd

L'entrée standard peut aussi être utilisée via un pipe :

cat /etc/passwd | grep -i "administrateur"

Options importantes

Option Description Exemple
-i Ignorer la casse grep -i 'mot' fichier
-w Correspondance de mot entier grep -w 'mot' fichier
-v Inverser la correspondance (afficher les non-correspondances) grep -v 'filtre' fichier
-n Afficher le numéro de ligne grep -n 'modèle' fichier
-l Lister seulement les noms de fichiers grep -l 'pattern' *.conf
-c Compter les lignes correspondantes grep -c 'erreur' syslog
-r / -R Recherche récursive grep -R 'données' /var/www/
-A N Afficher N lignes après la correspondance grep -A 2 'critique' messages
-B N Afficher N lignes avant la correspondance grep -B 1 'AVERTISSEMENT' log
-C N Afficher N lignes de contexte (avant et après) grep -C 3 'bug' traces

Recherche avec des expressions régulières

Les expressions régulières (regex) permettent des motifs de recherche complexes.

Recherche de motifs alternatifs

Pour chercher plusieurs termes sur une même ligne, on peut utiliser :

grep -E 'serveur|client' config.xml
egrep 'HTTP|HTTPS' headers.txt

egrep est équivalent à grep -E.

Recherche de motifs obligatoires (ET logique)

Pour trouver des lignes contenant à la fois "utilisaetur" ET "connecté" :

grep 'utilisateur' logfile | grep 'connecté'
grep 'utilisateur.*connecté' logfile

Utilisation des caractères spéciaux

Le point (.) correspond à n'importe quel caractère unique. Pour chercher littéralement un point, on l'échappe avec \ :

grep '192\.168\.1\.1' adresses.txt

Pour définir un nombre de répétitions, on utilise des accolades :

grep -E 'a{3}' texte.txt    # Correspond à trois 'a' consécutifs
grep -E 'mo{1,3}t' fichier  # Correspond à 'mot', 'moot', 'moooot'

Ancre de début et de fin de ligne

Le symbole ^ ancre le motif au début de la ligne, $ à la fin :

grep '^admin' users.list
grep 'erreur$' events.csv

Pour trouver les lignes vides :

grep '^$' fichier

Ensembles de caractères et plages

Les crochets [] définissent un ensemble de caractères acceptés :

grep '[Ll]inux' docs.txt
grep '[0-9]' numeros.txt
grep -E '[A-Za-z0-9]' identifiants

Pour chercher un ensemble qui ne doit PAS être présent, on utilise l'accent circonflexe à l'intérieur des crochets :

grep '[^aeiouy]' consonnes.txt

Utilisation de grep dans les tuyaux (pipes)

grep se combine parfaitement avec d'autres commandes via le pipe | :

ps aux | grep -i 'apache'
df -h | grep '/dev/sda1'

Résumé des métacaractères courants

Métacaractère Description Exemple
. N'importe quel caractère unique grep 'f.ichier' test
* Zéro ou plusieurs de l'élément précédent grep 'ab*c' test
+ Un ou plusieurs de l'élément précédent (étendu) grep -E 'ab+c' test
? Zéro ou un de l'élément précédent (étendu) grep -E 'ab?c' test
{n} Exactement n occurrences grep -E 'a{4}' test
{n,} n occurrences ou plus grep -E 'a{2,}' test
{n,m} Entre n et m occurrences grep -E 'a{2,4}' test

Étiquettes: grep Shell terminal command line regex

Publié le 11 juin à 03h56