====== Du bon emploi de grep ======
**grep** , **egrep** , **fgrep** , **rgrep** , **pgrep** - sont des commandes dans des systèmes d'exploitation de type Unix qui impriment des lignes correspondant à un modèle.
Le **grep** recherche des modèles (**pattern**) sur des fichiers (**input**) et affiche les lignes correspondantes.
En outre, les programmes de variantes **egrep** , **fgrep** et **rgrep** sont identiques à** grep -E** , **grep -F** et **grep -r** respectivement. Ces variantes sont obsolètes, mais sont fournies pour compatibilité avec les versions antérieures.
__**Pré requis**__
Pour les exemples ci dessus, créer un fichier __fichier.txt__ avec ce contenu
tendre
vendre
prendre
taper
tasser
masser
casser
caser
attendre
reprendre
surprendre
comprendre
surmonter
surpasser
surévaluer
surdoué
caler
tailler
lister
lisser
===== 1. grep : recherche de base =====
__Syntaxe__
grep LesOPtions LeMotif fichier
si plusieurs fichiers à rechercher
grep LesOPtions LeMotif fichier1 fichier2 fichier3
==== 1.1 Emploi simple ====
__Rechercher le motif 'www' dans /etc/default/grub__
grep 'GRUB' /etc/default/grub
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"
#GRUB_TERMINAL=console
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
#GRUB_DISABLE_RECOVERY="true"
#GRUB_INIT_TUNE="480 440 1"
Retrouvera toutes les occurences du motif GRUB
==== 1.2 Limiter le motif à un mot précis ====
Si l'on ne veut que le mot GRUB, il faut pas l'option **-w**
grep -w 'GRUB' /etc/default/grub
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
# you can see them in real GRUB with the command `vbeinfo'
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
==== 1.3 Gestion de la casse ====
Si l'on ne veut pas tenir compte de la casse, il faut utiliser l'option **-i**
$ grep -i 'grub' /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# info -f grub -n 'Simple configuration'
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"
# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
#GRUB_DISABLE_RECOVERY="true"
# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"
Cela sortira les motifs : **grub** et **GRUB**
==== 1.4 Les ancres (début et fin) ====
__Rechercher les motifs dont les lignes **COMMENCENT** par ; on utilisera le **^**__
$ egrep "^#GRUB" /etc/default/grub
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"
#GRUB_TERMINAL=console
#GRUB_GFXMODE=640x480
#GRUB_DISABLE_LINUX_UUID=true
#GRUB_DISABLE_RECOVERY="true"
#GRUB_INIT_TUNE="480 440 1"
__Rechercher les motifs dont les lignes **FINISSENT** par ; on utilisera le **$**__
$ grep "console$" /etc/default/grub
#GRUB_TERMINAL=console
__Rechercher les lignes ne contenant qu'un motif. Mix des 2 situations précédentes:__
$ grep "^leMotif$' /le/fichier/lu
==== 1.5 Occurence de caractères ====
__Utiliser le point pour remplacer un caractère__
$ grep ‘ca.er’ fichier.txt
caser
caler
Pour complacer, plusieurs caractères, mettre **n points avec n=nombre de caractères à remplacer**.
$ grep ‘li..er’ fichier.txt
lister
lisser
Pour remplacer **un nombre non défini** de caractères faire suivre le point d’un **astérix * **
$ grep ‘sur.*er’ fichier.txt
surmonter
surpasser
surévaluer
==== 1.6 Compter, afficher des numéros de lignes ====
__Utiliser l'option** -c** pour compter le nombre d'occurence__
$ grep -c 'er$' fichier.txt
12
__Afficher le numéro des lignes contenant l'occurence du motif de recherche : option **-n**__
$ grep -n 'er$' fichier.txt
4:taper
5:tasser
6:masser
7:casser
8:caser
13:surmonter
14:surpasser
15:surévaluer
17:caler
18:tailler
19:lister
20:lisser
==== 1.7 Coloriser les occurrences du motif de recherche ====
__Ajouter l'option** --color**__
$ grep --color 'er$' fichier.txt
Affichera le motif en rouge sur la sortie écran
__Changer la couleur par défaut.__
$ GREP_COLOR='1;32' grep --color 'er$' fichier.txt
1.8 Forcer la correspondance inversée grep
Utiliser l'option** -v** pour imprimer inverse la correspondance; c'est-à-dire qu'il ne correspond qu'aux lignes qui ne contiennent pas le mot donné. Par exemple, imprimez toutes les lignes qui ne contiennent pas le motif lister
$ egrep -v 'lister' fichier.txt
On peut bien sûr le faire aussi avec des regex (egrep)
$ egrep -v '^ca' fichier.txt
Affichera tout ce qui ne commpence pas par le motif 'ca'
===== 2. GREP et LES REGEX (expressions régulières) =====
==== 2.1 Le OU (OR) et le ET (AND) ====
__Pour combiner des motifs : **|** (équivalant à OU)__
$ egrep "INIT|GFX" /etc/default/grub
#GRUB_GFXMODE=640x480
#GRUB_INIT_TUNE="480 440 1"
La sortie contiendra les résulats relatifs aux 2 motifs
__Pour obliger 2 motis **.*** (équivalant à AND)__
$ egrep "GRUB.*DEFAULT|DEFAUT.*GRUB" /etc/default/grub
GRUB_DEFAULT=0
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
Retournera les lignes comprenant GRUB et DEFAULT ou DEFAULT
**//Pour utiliser le OR et le AND avec grep et non egrep, il faudra préfixer le | avec un antislash ://**
$ grep "INIT\|GFX" /etc/default/grub
#GRUB_GFXMODE=640x480
#GRUB_INIT_TUNE="480 440 1"
==== 2.2 Le crochets [ ] ====
Les expressions entre crochets **[]** permettent de faire correspondre un groupe de caractères en les mettant entre crochets [].
$ egrep 'sur' fichier.txt
surprendre
surmonter
surpasser
surévaluer
surdoué
Retournera tout ce qui contient le motif 'sur'.
$ egrep 'sur[dp]' fichier.txt
surprendre
surpasser
surdoué
Retournera ce qui commence par le motif ‘sur’ puis la lettre ‘d’ ou ‘p’.
Comme le précédent, mais **l'option entre crochet suivi de ^ permet d'éliminer les résulats** contenant ensuite les lettres ‘d’ et 'p'.
$ egrep 'sur[^dp]' fichier.txt
surmonter
surévaluer
Au lieu de placer les caractères un par un, vous pouvez spécifier une plage de caractères à l'intérieur des crochets. Une expression de plage est construite en spécifiant les premier et dernier caractères de la plage séparés par un trait d'union. Par exemple, [a-e] est équivalent à [abcde] et [1-3] est équivalent à [123].
$ egrep 'sur[a-f]' fichier.txt
surévaluer
surdoué
Retournera tout ce qui commence par le motif ‘sur’ puis les lettres a, b, c, d, e ou f.
Ainsi pour ne chercher que les lignes commençant par une majuscule :
$ grep '^[A-Z]' monFichier.txt
grep prend également en charge des classes de caractères prédéfinies qui sont placées entre crochets.
En voici la liste :
|[:alnum:] | Caractères alphanumériques|
|[:alpha:] | Caractères alphabétiques|
|[:blank:] | Espaces et tabulations|
|[:digit:] | Chiffres|
|[:lower:] | Lettres minuscules|
|[:upper:] | Lettres majuscules|
==== 2.3 Les quantificateurs ====
Les quantificateurs vous permettent de spécifier le nombre d'occurrences d'éléments qui doivent être présents pour qu'une correspondance se produise. Le tableau suivant montre les quantificateurs pris en charge par grep
| * | Faire correspondre l'élément précédent zéro ou plusieurs fois.|
| ? | Faire correspondre l'élément précédent zéro ou une fois.|
| + | Faire correspondre l'élément précédent une ou plusieurs fois.|
| {n} | Faire correspondre exactement à l'élément précédent n fois.|
| {n,} | Faire correspondre à l'élément précédent au moins n fois.|
| {, m} | Faire orrespondre à l'élément précédent au maximum m fois.|
| {n, m} | Faire correspondre l'élément précédent de n à m fois.|
**On peut bien sûr mixer les crochets et les accolades**.
Par exemple, recherche de chaines numériques contenant entre 5 et 7 chiffres:
$ egrep '[[:digit:]]{3,9}' monFichierAvecDesNombres.txt
==== 2.4 GREP et la récursivité ====
__Utiliser l'option -R__
# grep -R 192.168.0. /etc/ssh
/etc/ssh/pssh_host/pssh_hosts:#root@192.168.0.23
/etc/ssh/pssh_host/pssh_hosts:root@192.168.0.11
/etc/ssh/pssh_host/pssh_hosts:root@192.168.0.43
La requête de recherche du motif s'effectuera dans le répertoire donné et ses sous-répertoires
__Avec des REGEX. Syntaxe identique, mais avec egrep__
# egrep -R '192.168.0.(23|11)' /etc/ssh
/etc/ssh/pssh_host/pssh_hosts:#root@192.168.0.23
/etc/ssh/pssh_host/pssh_hosts:root@192.168.0.11
===== 3. Les tubes (pipes) =====
Utiliser grep avec des pipes pour filtrer les résultats d'une commande
$ sudo dmesg | egrep '(s|h)d[a-z]'
Triera la sortie de dmesg en ne gardant que les lignes contenant le nom des Diques Durs.
===== 4. Mémo =====
==== Rappel ====
| grep | Expressions régulières de base (BRE)|
| egrep (grep -E) | Expressions régulières étendues (ERE) |
| fgrep (grep -F) | Ne recherche que les chaînes |
| pgrep | Processus de recherche par nom |
==== Les principales options de grep ====
| Options de grep| Description|
| -i| Ignorer la casse|
| -w| Le motif ne correspond qu’à un mot|
| -v| Inverser la sélection|
| -n| Afficher les numéros de lignes des occurences|
| -r| Recherche récursive|
| -R| Identique à -r mais inclut les liens symboliques|
| -l| Afficher uniquement le nom du fichier contenant l’occurence|
| -c| Compter le nombre d’occurences|
| --color| Afficher l’occurence en couleur|
==== Grep plus en détail ====
$ man grep