L’article qui suit traite de la commande grep ; l’objectif est de montrer ces fonctionnalités avec quelques explications et pas mal d’exemples. Sur le thème des commandes Linux, vous pouvez retrouver un autre article sur la commande find.
L’ensemble des exemples ont été mis en place et effectué sur mon Linux Mint 18. Ma version de grep est la GNU 2.25.
Petit rappel, la commande grep qu’est ce que c’est ?
Grep est une commande qui permet de faire des recherches de chaînes de caractères dans un flux de texte (fichier ou sortie d’une autre commande, par exemple) et elle accepte les expressions régulières.
Il en existe plusieurs variantes, par exemple :
- agrep, qui permet la recherche de chaîne approximative
- zgrep, qui permet la recherche dans un fichier compressé
- rgrep, qui permet la recherche dans tous les fichiers d’un répertoire
On en trouve d’autres avec chacune ces spécificités (egrep, fgrep, tcgrep, pgrep).
Exemples
La base
L’utilisation générale de la commande grep se fait de la manière suivante:
grep options "recherche" chemin
Avec :
- options: les options possibles, que nous verrons un peu plus tard
- recherche : le terme à rechercher entre guillemets
- chemin : le chemin du fichier (ou dossier) où faire la recherche
Les guillemets autour du terme à rechercher ne sont pas obligatoire. Néanmoins je les conseils dès lors qu’il y a des caractères autres qu’alphanumériques dans votre recherche.
Voici quelques utilisations possible :
# recherche "192" dans le fichier hosts grep "192" /etc/hosts # recherche du terme ip dans le répertoire de configuration de apache2 grep "ip" /etc/apache2/conf.d/* # recherche des lignes d'erreurs dans des fichiers de logs grep "ERROR" ./tomcat/log/*.log
Comme vous pouvez le voir, il est possible d’utiliser des patterns afin de cibler, par exemple, un type de fichier ou l’ensemble des fichiers d’un répertoire.
Il est aussi possible d’utiliser des expressions régulières dans le terme de recherche
# recherche des suites de 10 chiffres dans tous les fichiers du répertoire courant grep "[0-9]\{10\}" *
Je ne suis pas un expert en expressions régulières et je ne souhaite pas dire de bêtises, je vous fournis donc un lien intéressant pour bien débuter avec les expressions régulières. Il existe également des sites webs permettant de s’entrainer avec les expressions régulières.
Les options les plus utiles
Voici une liste non exhaustive des options les plus utiles :
- –color : un indispensable, permettra de faire ressortir le terme recherché en couleur dans les résultats
- -r : recherche récursive dans tous les fichiers et dossiers du répertoire en paramètre
- -i : permet d’ignorer la casse
- -c : retourne le nombre d’occurrences de la recherche par fichier
- -m + num : Par exemple -m5, recherchera maximum 5 résultats par fichiers, après le 5 ème la recherche s’arrêtera sur le fichier et passera au suivant
- -n : affichera le numéro de ligne à laquelle se trouve le résultat dans le fichier
- -A + num : Par exemple -A3, affichera les 3 lignes suivants le terme de recherche
- -B + num : Par exemple -B6, affichera les 6 lignes précédents le terme de recherche
- -C + num : Par exemple -C2, affichera les 2 lignes précédents et suivants le terme de recherche
- -w : affichera seulement les résultats où le terme de recherche est le mot complet
Il existe d’autres options bien entendu, si vous êtes curieux je vous invite à poursuivre vos recherches au-delà de cet article.
Exemples d’utilisations des options
Voici un exemple d’utilisation en image des options -n (numéro de ligne), -i (casse) et –color :

Il était 23 h lorsque je fais cette petite démonstration, je n’étais pas particulièrement inspiré ;).
Maintenant d’autres exemples plus fonctionnels, mis en contexte.
# recherche la configuration des workers (loadblancing) dans apache, récursivement grep -r "worker" /etc/apache2/ # la même chose en couleur grep -r --color "worker" /etc/apache2 # on complète en affichant les numéros de ligne concernés grep -rn --color "worker" /etc/apache2
Autres exemples pour récupérer les lignes autours d’un terme recherché :
# recherche d'erreur dans des logs Java, en affichant la source d'erreur (3 lignes suivants l'erreur) grep --color -A3 "ERROR" /opt/tomcat/logs/*.log # même chose mais en remontant les 3 lignes précédents l'erreur grep --color -B3 "ERROR" /opt/tomcat/logs/*.log # même chose avec 3 lignes avant et après grep --color -A3 -B3 /opt/tomcat/logs/*.log # c'est l'équivalent de grep --color -C3 /opt/tomcat/logs/*.log
Une autre petite image afin que l’option -w soit plus clair :

Voici un exemple pour l’option -c :
# compter les occurences d'un mot par fichier dans le répertoire de log du système grep -c "word" /var/log/* # la même chose en ignorant la casse grep -ci "word" /var/log/* # de manière récursive dans les sous répertoires grep -rci "word" /var/log/*
Utilisation des opérateur OR, AND et NOT
Voici des exemples avec l’opérator OR, qui permet de recherche plusieurs termes disjointement.
# recherche des termes ERROR et CRITICAL dans les logs grep "ERROR\|CRITICAL" /opt/tomcat/log/*.log # même chose avec l'option -E qui gère l'utilisation étendu des regex grep -E "ERROR|CRITICAL" /opt/tomcat/log/*.log # il y a également l'option -e grep -e "ERROR" -e "CRITICAL" /opt/tomcat/log/*.log # egrep est équivalent à grep -E egrep "ERROR|CRITICAL" /opt/tomcat/log/*.log
Pour faire un AND, il est nécessaire d’utiliser les pipes.
Rappel : un pipe permet d’utiliser la sortie d’une commande pour l’appliquer à l’entrée d’une autre.
Dans l’exemple ci-dessous, l’objectif est de rechercher les NullPointerException parmi les erreurs dans la log d’un Tomcat
# On filtre les logs sur le mot error, puis on filtre le résultat pour rechercher les NullPointerException grep -E "ERROR" /opt/tomcat/log/*.log | grep -E "NullPointerException" # La commande suivante offre le même résultat grep "ERROR" /opt/tomcat/log/*.log | grep "NullPointerException"
Enfin, pour utiliser la négation logique , il faut utiliser l’option -v, par exemple :
# recherche les lignes sans le mot démonstration grep -v "démonstration" *.txt # recherche les erreurs qui ne sont pas des NullPointerException grep "ERROR" /opt/tomcat/log/*.log | grep -v "NullPointerException"
Utiliser la commande grep comme un filtre
Dans les faits, la commande grep est autant utilisée pour faire de la recherche brut dans des fichiers que pour filtrer le résultat d’autres commandes. Lorsque vous utilisez une commande verbeuse, il est intéressant de filtrer le résultat de cette commande pour obtenir uniquement l’information souhaitée.
Par exemple, avec la commande « ps » qui retourne la liste des process à l’instant sur la machine. Elle retourne souvent plusieurs centaines de lignes, un grep sur le nom du process à rechercher fait des miracles!
Voici plusieurs exemples en image :

A votre tour
Le meilleur moyen d’apprécier l’utilisation des commandes et leurs puissances est de s’y essayer. La prochaine fois que vous avez une recherche à faire, prenez votre courage à deux mains pour vous lancer.
Si vous êtes déjà un habitué de son utilisation, vous pouvez partager vos tips aux autres lecteurs en commentaire. J’essayerai de les ajouter à l’article.
Pour finir
Nous avons vu une bonne partie des fonctionnalités de la commande grep, pour creuser le sujet je vous invite à essayer par vous-même et vous référer au manuel utilisateur. Il existe également de très nombreuses sources anglophones que vous trouverez dans n’importe quel moteur de recherche.
J’espère ne pas attendre 1 an pour sortir le prochain article sur une nouvelle commande (sed et/ou awk).
N’hésitez pas à me laisser un feedback sur cet article en attribuant une note (système d’étoiles en dessous de l’article) ou en me commentant vos impressions. Et si vous l’avez apprécié, vous pouvez également le partager pour mon plus grand plaisir ;).
Sources:
Partager l'article :




En parallèle de grep et egrep (permet de faire des expressions rationnelles plus poussés), il y a le très rapide ‘ack’ qui est plus intelligent sur les fichiers à scanner…
Bref, en interactif, un premier ack suivis d’un pipe vers grep est souvent bien plus performant que deux grep.
Très intéressant. Je regarde ça dans les jours qui viennent, et j’ajouterai cette alternative. Le gain se situe au niveau temps de réponse uniquement?
La recherche n’est pas tout à fait la même. Il y a un trie ‘intelligent’ sur les types de fichiers par exemple. Sinon, c’est du regex perl avec toute sa puissance donc 😉
Je me renseigne, je l’ai vraiment jamais utilisé. Merci pour le tips.
Juste une petite précision concernant l’option -r, il vaut mieux utiliser l’option -R qui est un peut différente, voici un extrait du man de GNU grep 2.20 packagé dans debian jessie :
-r, –recursive
Read all files under each directory, recursively, following symbolic links only if they are on the command line. Note that if no file operand is given, grep searches the working directory. This is equivalent to the -d recurse option.
-R, –dereference-recursive
Read all files under each directory, recursively. Follow all symbolic links, unlike -r.
La différence est très subtile mais elle a son importance, entre « following symbolic links only if they are on the command line » et « Follow all symbolic links, unlike -r ».
A cause de cela je n’utilise jamais l’option -r mais toujours l’option -R lorsque je veux être sur d’avoir tous les résultats dans un dossier de manière récursive.
Sinon, l’article est sympa, bon boulot 🙂
Merci pour cette précision, en potassant j’avais vu ce point et hésité à le mettre ^^.
Merci pour le tutoriel !