GREP | Rechercher une aiguille dans un système

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:

Écrire un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec une *

Quelle est le premier caractère du mot lf19yr ? :