Trucs de geek : grep

L'outil de vos recherches sera trés certainement grep (global regular expression print). Voyons en les principales utilisations.

La comamnde grep permet de rechercher une chaîne de caractère dans un fichier (pratique quand on ne sait plus quel programme modifie une rubrique d'une base de données). Par défaut le résultat s'affiche à l'écran mais il est toujours possible de le rediriger vers un fichier. N'oublions pas que dans grep le "re" signifie "regular expression". Nous travaillons avec grep avec des expressions régulières même si nous ne les exploitons pas ( toujours | souvent ). Il n'empêche que savoir comment construire une expression régulière va améliorer vos recherches et résultats avec cet outil.

L'utilisation la plus basique consiste à rechercher une chaine de caractère dans un fichier ou plusieurs fichiers :

$ grep root /etc/passwd

root:x:0:0:root:/root:/bin/bash

On voit bien souvent cette autre utilisation :

$ cat /etc/passwd |grep root

qui donne le même résultat mais avec une instruction supplémentaire.

La variante avec plusieurs fichiers ressemble à cela :

$ grep jfd /etc/passwd /etc/shadow /etc/fstab /etc/mtab

Elle vous affichera les lignes contenant l'expression recherchée. Si vous ne voulez que la liste des fichiers qui contiennent l'expression recherchée il faut ajouter l'option "-" :

$ grep -l jfd /etc/*

Une option sympathique de grep est le -v qui permet d'exclure le critère de rechercher des résultats : cela va inverser la recherche et exclure des résultats le motif fourni. Exemple : Soit le fichier suivant :

$ cat test.txt

qui donne :

Canada

USA

Mexique

Alors :

$ grep -v USA test.txt

donne :

Canada
Mexique


Autre exemple sur une recherche sur les procéssus en cours du style "ps -ef". Si vous voulez n'afficher que le procéssus concernant firefox par exemple vous allez renvoyer la commande "ps" vers un grep firefox. Ce qui donne :

$ ps -ef|grep firefox

donne :

jfd       2506  2264  6 08:16 ?        00:24:03 /usr/lib/firefox/firefox --sm-config-prefix /firefox-5Xrazx/ --sm-client-id 109d656c6c000138564972800000025090018 --screen 0
jfd       5141  2520  0 14:26 pts/0    00:00:00 grep --color=auto firefox

Si on souhaite éliminer la seconde ligne on ajout grep -v grep. Ce qui donne :

$ ps -ef | grep firefox|grep -v grep

donne :

jfd       2506  2264  6 08:16 ?        00:24:16 /usr/lib/firefox/firefox --sm-config-prefix /firefox-5Xrazx/ --sm-client-id 109d656c6c000138564972800000025090018 --screen 0

Autre option utile : le -w qui limite la rechercher aux mots exacts. Un "-w JIM" ramène" JIM" mais pas "JIMI".

Autre option : le -i qui ignore la case : A utiliser presque systématiquement.

Si souhaitez connaître les numéros de lignes concernées, ajoutez l'option "-n".

Si vous souhaitez réaliser votre recherche sur un dossier utilisez l'option "-r" comme ceci :

$ grep -r jfd /etc/

Toutes ces options peuvent être utlisés ensemble (sauf le n et le l).

Si vous souhaitez n'obtenir que le nombre de lignes trouvées utilisez le commutateur "c". Exemple :

$ grep -c UUID /etc/fstab

Voyons maintenant l'utilisation des expressions régulières (Ne fuyez pas ce n'est pas si compliqué).

Si votre recherche ne porte que sur le début de chaque ligne, ajouter le chapeau :

$ grep "^avahi" /etc/passwd

avahi-autoipd:x:106:117:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
avahi:x:107:118:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false

Si je cherche ceux qui n'ont pas d'interprêteur de commande par défaut (7ème rubrique égale à "/bin/false)" :

$ grep "false$" /etc/passwd

On n'affiche donc que ce qui se termine par "false".

Si vous voulez afficher un fichier de configuration sans les commentaires vous pouvez demander à grep de ne pas afficher qui cqui commence par un dièze (#)?. Cela donne :

$ grep ^[^#] /etc/postfix/main.cf

Le premier chapeau signifie ce qui commence par ce qui suit. Et à l'intrieur des crochets le second chapeau signifie : n'est pas un dièze.

Un truc pour finir : si vous faites un grep sur un fichier XML et que vous rencontrez l'anomalie suivante :

Fichier binaire votre_fichier.xml correspondant

vous devez ajouter l'option suivnate "--binary-files=text". La commande devien donc :

$ grep la_recherche votre_fichier.xml --binary-files=text

Fait le 10/03/2014

Tags: