Du bon emploi de grep
Les commentaires ou précisions sont à apporter dans ce thead : https://forum-francophone-linuxmint.fr/ ... 12&t=15621 , thx.
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
Code : Tout sélectionner
tendre
vendre
prendre
taper
tasser
masser
casser
caser
attendre
reprendre
surprendre
comprendre
surmonter
surpasser
surévaluer
surdoué
caler
tailler
lister
lisser1. grep : recherche de base
Syntaxe
Code : Tout sélectionner
grep LesOptions LeMotif fichierCode : Tout sélectionner
grep LesOptions LeMotif fichier1 fichier2 fichier3Rechercher le motif 'www' dans /etc/default/grub
Code : Tout sélectionner
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"1.2 Limiter le motif à un mot précis
Si l'on ne veut que le mot GRUB, il faut l'option -w
Code : Tout sélectionner
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 LinuxSi l'on ne veut pas tenir compte de la casse, il faut utiliser l'option -i
Code : Tout sélectionner
$ 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"1.4 Les ancres (début et fin)
Rechercher les motifs dont les lignes COMMENCENT par ; on utilisera le ^
Code : Tout sélectionner
$ 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"Code : Tout sélectionner
$ grep "console$" /etc/default/grub
#GRUB_TERMINAL=consoleRechercher les lignes ne contenant qu'un motif. Mix des 2 situations précédentes:
Code : Tout sélectionner
$ grep "^leMotif$' /le/fichier/luUtiliser le point pour remplacer un caractère
Code : Tout sélectionner
$ grep ‘ca.er’ fichier.txt
caser
calerCode : Tout sélectionner
$ grep ‘li..er’ fichier.txt
lister
lisserCode : Tout sélectionner
$ grep ‘sur.*er’ fichier.txt
surmonter
surpasser
surévaluer1.6 Compter, afficher des numéros de lignes
Utiliser l'option -c pour compter le nombre d'occurence
[code$ grep -c 'er$' fichier.txt
12[/code]
Afficher le numéro des lignes contenant l'occurence du motif de recherche
Code : Tout sélectionner
$ 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:lisserAjouter l'option --color
Code : Tout sélectionner
$ grep --color 'er$' fichier.txt 
Changer la couleur par défaut.
Code : Tout sélectionner
$ 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 le motif lister
Code : Tout sélectionner
$ egrep -v 'lister' fichier.txtCode : Tout sélectionner
$ egrep -v '^ca' fichier.txt2. GREP et LES REGEX (expressions régulières)
2.1 Le OU (OR) et le ET (AND)
Pour combiner des motifs : | (équivalant à OU)
Code : Tout sélectionner
$ egrep "INIT|GFX" /etc/default/grub
#GRUB_GFXMODE=640x480
#GRUB_INIT_TUNE="480 440 1"Pour obliger 2 motis .* (équivalant à AND)
Code : Tout sélectionner
$ egrep "GRUB.*DEFAULT|DEFAUT.*GRUB" /etc/default/grub
GRUB_DEFAULT=0
GRUB_CMDLINE_LINUX_DEFAULT="quiet"Pour utiliser le OR et le AND avec grep et non egrep, il faudra préfixer le | avec un antislash \ :
Code : Tout sélectionner
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 [].
Par exemple, pour rechercher les lignes qui commencent par un t ou un m et finissent par er, dans le fichier fichier.txt, utiliser la syntaxe
Code : Tout sélectionner
$ egrep '^[tm].*er' fichier.txt
taper
tasser
masser
taillerCode : Tout sélectionner
$ egrep 'sur' fichier.txt
surprendre
surmonter
surpasserCode : Tout sélectionner
$ egrep 'sur[dp]' fichier.txt
surprendre
surpasser
surdoué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'.
Code : Tout sélectionner
$ egrep 'sur[^dp]' fichier.txt
surmonter
surévaluerAu 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].
Code : Tout sélectionner
$ egrep 'sur[a-f]' fichier.txt
surévaluer
surdouéAinsi pour ne chercher que les lignes commençant par une majuscule :
Code : Tout sélectionner
$ grep '^[A-Z]' monFichier.txtgrep 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.
Code : Tout sélectionner
$ egrep '[[:digit:]]{3,9}' monFichierAvecDesNombres.txt2.4 GREP et la récursivité
Utiliser l'option -R
Code : Tout sélectionner
# 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.43Avec des REGEX. Syntaxe identique, mais avec egrep
Code : Tout sélectionner
# 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.113. Les tubes (pipes)
Utiliser grep avec des pipes pour filtrer les résultats d'une commande
Code : Tout sélectionner
$ sudo dmesg | egrep '(s|h)d[a-z]'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
-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
Pour le reste
Code : Tout sélectionner
man grephttps://forum-francophone-linuxmint.fr/ ... 12&t=15621
