Commande grep : Rechercher une aiguille dans un système

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 :

Grep options
grep -n -i –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 :

commande grep
grep -w

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 :

commande grep
Grep comme filtre

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 :

Facebooktwitterredditlinkedinmail
 

7 commentaires

  1. Sytoka Répondre

    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.

  2. Wodric Auteur de l’articleRépondre

    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?

    • Sytoka Répondre

      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 😉

      • Wodric Auteur de l’articleRépondre

        Je me renseigne, je l’ai vraiment jamais utilisé. Merci pour le tips.

  3. nierdz Répondre

    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 🙂

    • Wodric Auteur de l’articleRépondre

      Merci pour cette précision, en potassant j’avais vu ce point et hésité à le mettre ^^.

Vous aussi participez, laissez un commentaire