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 |