Commandes Linux : grep

GREP

Installé avec le paquet grep

Remarques :

  • Par défaut, grep recherche une expression régulière basique, c’est à dire dont les caractères suivants doivent être échappés pour retrouver une signification particulière : \? \+ \( \) \| \{ et \}.
  • Avec l’option -E, elle recherche une expression régulière étendue, c’est à dire dont les caractères suivants ont une signification particulière : ? + ( ) | { et }.
  • Expressions régulières basique et étendue (man 7 regex) sont à distinguer des Wildcards ou Globbing patterns (man 7 glob) utilisés par la plupart des commandes shell

 

regexp
basique
[…] ensemble
[^…] ensemble exclu
[x-y] intervalle
. n’importe quel caractère
répétition * zéro ou plus
+ un ou plus
? zéro ou un
{n} n fois
{n,m} de n à m fois
regexp
étendue
| ou logique
(…) sous-section
ligne ^ début
$ fin

 

Afficher la version de la commande grep

apt-cache policy grep

ou

grep --version

 

Rechercher un motif dans un ou plusieurs fichiers

Le motif est une expression régulière basique (ERb, BRE ou Expression Rationnelle)
grep -e "pattern" filenames

ou

grep "pattern" filenames

Comportement par défaut de la commande grep.

Le motif est une expression régulière étendue (ERe ou ERE)
grep -E "pattern" filenames

ou

egrep "pattern" filenames

 

Rechercher plusieurs motifs dans un ou plusieurs fichiers

grep -e "pattern1" -e "pattern2" filenames

 

Coloriser un motif trouvé

grep --colour "pattern" filenames

 

Rechercher un motif sans respect de la casse

grep -i "pattern" filenames

L’option -e est implicite.

 

Rechercher des motifs listés dans un fichier référence

grep -f reffilename filenames

Si reffilename contient des ERb.

egrep -f reffilename filenames

Si reffilename contient des ERe.
ex :
Avec listing.txt contenant :

^[[:upper:]]
(Vivamus)
[[:digit:]]
# grep -f listing.txt file*
file1.txt:Curabitur ullamcorper ultricies nisi.cCras dapibus.
file1.txt:(Vivamus) elementum semper nisi.
file3.txt:Aenean commodo ligula eget dolor.
file3.txt:Vivamus elementum semper nisi.
file3.txt:Aenean vulputate eleifend tellus.
file3.txt:Phrase 7 : curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo.

Ci-dessus, le résultat de : commence par une lettre majuscule, ou contient le terme (Vivamus) ou contient un chiffre.

 

Afficher les lignes non vides d’un fichier

grep -v "^$" filenames

L’option -v permet d’inverser le résultat. On recherche les lignes vides puis on inverse pour obtenir les lignes non vides.

 

Afficher le contenu d’un fichier sans les commentaires et lignes vides

grep -v -E "^(#|/|$|;)" filename

ou

grep -v -E "^#|^/|^$|^;" filename

Toutefois, si la ligne commence par un espace, suivi du caractère commentant la ligne, elle sera affichée.

grep -v -E "^[[:space:]]*(#|/|$|;)" filename

Tous les commentaires seront occultés, y compris ceux débutant par des espaces.
ex :

# grep -v -E "^#|^/|^$" /etc/bind/named.conf
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.views";
include "/etc/bind/named.conf.servers";
include "/etc/bind/named.conf.controls";
include "/etc/bind/named.conf.acls";
include "/etc/bind/named.conf.loggings";
include "/etc/bind/named.conf.keys";

 

Rechercher une occurrence exacte d’un mot

grep -w "word" filenames

 

Afficher N lignes avant (Before) l’occurrence trouvée

grep -B N "pattern" filenames

 

Afficher N lignes après (After) l’occurrence trouvée

grep -A N "pattern" filenames

 

Afficher N lignes avant (Before) et N lignes après (After) l’occurrence trouvée

grep -C N "pattern" filenames

Equivaut à :
grep -B N -A N "pattern" filenames

 

Recherche récursive

grep -r "pattern" directory

 

Compter le nombre de résultats sans les afficher

grep -c "pattern" filenames

ex :

# grep -c "^$" file1.txt
13

Equivaut à :
# grep "^$" file1.txt | wc -l

 

Afficher uniquement le nom des fichiers où l’occurrence a été trouvée

grep -l "pattern" filenames

 

Afficher uniquement l’occurrence trouvée et non la ligne complète

grep -o "pattern" filenames

 

Afficher la position en nombre de caractères de l’occurrence trouvée

grep -b "pattern" filenames

La position des caractères commence à 0 pour le premier caractère du fichier.
ex :

# grep -b "Curabitur" file1.txt
95:Curabitur ullamcorper ultricies nisi. Cras dapibus.

 

Afficher le numéro de ligne où se trouve l’occurrence trouvée

grep -n "pattern" filenames

ex :

# grep -n "Curabitur" file1.txt
3:Curabitur ullamcorper ultricies nisi. Cras dapibus.

 

Rechercher une URL dans un fichier

grep -o "http://[^[:space:]]*.\(fr\|priv\|org\)" file*
file15.txt:http://snipeit.opensharing.priv
file1.txt:http://www.opensharing.fr
file2.txt:http://debian.org

 

Exécuter grep en sortie de la commande find

find path -type f -print0 | xargs -0 grep "pattern"

ex :

# find . -type f -print0 | xargs -0 grep "Curabitur"
./file1.txt:Curabitur ullamcorper ultricies nisi.
./file1.txt:Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo.
./file3.txt:Curabitur ullamcorper ultricies nisi.
./file3.txt:Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo.
find path ! -regex ".*/\..*" -print0 | xargs -0 grep "pattern"

Cette dernière commande exclura les fichiers et dossiers cachés du résultat.

 

Afficher les logs relatifs à un service particulier depuis les logs système

grep --colour -E "service" /var/log/syslog

ex :

# grep --colour -E "named" /var/log/syslog
[...]
Jul 16 23:51:44 dns1-test named[487]: zone 1.168.192.in-addr.arpa/IN/internal: loaded serial 2016061909
Jul 16 23:51:44 dns1-test named[487]: zone opensharing.priv/IN/internal: loaded serial 2016061914
Jul 16 23:51:44 dns1-test named[487]: zone 255.in-addr.arpa/IN/internal: loaded serial 1
Jul 16 23:51:44 dns1-test named[487]: zone localhost/IN/internal: loaded serial 2
Jul 16 23:51:44 dns1-test named[487]: all zones loaded
Jul 16 23:51:44 dns1-test named[487]: running
[...]

 

Différences entre ERb et ERe

La synthèse qui suit est reprise du site Mon pense-bête de Ronan Quennec.

Les ERb ou Expressions Régulières basiques

Elles sont utilisées, entre autres, par les commandes suivantes : vi, grep (avec ou sans l’option -e), expr, sed, etc.

Caractère spécial Signification
\{n\} n fois le caractère précédent
\{n,\} Au moins n fois le caractère précédent
\{n,x\} Entre n et x fois le caractère précédent
\(ERb\) Mémorisation d’une ERb
\1, \2, … Rappel de mémorisation

Dans les ERB, le caractère « \ » donne une signification spéciale aux parenthèses et accolades.
Exemples :

Expression Régulière basique Signification
\-[A-Z]\{2\}\- Chaine contenant un mot de 2 lettres majuscules entouré par des tirets (-)
BOUCHES-DU-RHONE
EURE-ET-LOIR
VAL-DE-MARNE
Les ERe ou Expressions Régulières étendues

Elles sont utilisées, entre autres, par les commandes suivantes : grep (avec l’option -E), awk, etc.

Caractère spécial Signification
? 0 ou 1 fois le caractère ou regroupement précédent
+ 1 à n fois le caractère ou regroupement précédent
{n} n fois le caractère ou regroupement précédent
{n,} Au moins n fois le caractère ou regroupement précédent
{n,x} Entre n et x fois le caractère ou regroupement précédent
(er1) Regroupement
er1 | er2 | er3 Alternatives

Dans les ERe, les accolades et parenthèses perdent leur signification spéciale si elles sont précédées d’un antislash.
Exemples :

Expression Régulière étendue Signification
^[+-]?[0-9]+$ Chaine représentant un nombre entier d’au moins 1 chiffre précédé éventuellement du signe + ou –
2
-56
+235
789654
\([a-zA-Z]{3}\) Chaine contenant 3 lettres minuscules et/ou majuscules et entourés de parenthèses.
HERBIERS (Les) Herbiers
\([-a-zA-Z _]{4,}\) Chaine contenant au moins 4 caractères composées de lettres minuscules et/ou majuscules, de tiret (-), d’espace et de tiret bas (_) et le tout entouré de parenthèses.
1er (Ouest)
CASTILLON (CANTON DE LEMBEYE)
2e (Nord-Ouest)
^41|yotte$ Chaine commençant par « 41 » ou finissant par « yotte »
41 57 57463 3 MOSELLE Moselle
41 88 88160 4 VOSGES Vosges
06 976 97608 0 MAYOTTE Mayotte
(in|re)+ Chaine composée de 1 à n occurences de « in » ou de « re » (en minuscule)
Finistère
Indre-et-Loire
Martinique
Les caractères communs aux ERb et ERe
Caractère spécial Signification
^ Début de ligne
$ Fin de ligne
. (point) Un caractère quelconque
[liste_de_caractères] Un caractère cité dans la liste
[^liste_de_caractères] Un caractère qui n’est pas cité dans la liste
* 0 à n fois le caractère ou regroupement précédent
\<expression Début d’un mot. Caractères pouvant faire partie d’un mot : [A-Za-z0-9_]
expression\> Fin d’un mot
\<expression\> Mot complet
\c Protection du caractère spécial « c »/td>

Exemples :
Les expressions « space » et « tab » représentent les touches [espace] et [tabulation].
La tabulation est représentée par les caractères « \t ».

Expression Régulière Signification
soleil Chaine contenant « soleil ».
Aujourd’hui il y a du soleil, mais demain il pleut !
soleil toujours.
Passer ses vacances au soleil.
^soleil Chaine commençant par « soleil ».
soleil toujours.
soleil$ Chaine se terminant par « soleil ».
Passer ses vacances au soleil.
^[A-Z][5-9].$ Chaine composée de 3 caractères.Le premier est une majuscule, le second est un chiffre entre 5 et 9 et le dernier un caractère quelconque.
B6z
Z5*
^$ Chaine vide (aucun caractère entre ^ et $)
^[space tab]*$ Chaine contenant entre 0 et n caractères espace ou tabulation
7space[0-79]A* Chaine contenant le chiffre 7, suivi d’un espace, suivi de n’importe quel chiffre sauf 8, suivi de la lettre A 0 à n fois.
x7 6
abc7 9Axy
7 1AAAAAAAAAAAAAAAAbfgddghjgdhj
[0-9][^A-Z_]$ Chaine dont l’avant dernier caractère est un chiffre et le dernier n’est ni une lettre majuscule ni un caractère souligné.
AZER1a
3*
440008b
\<tout Chaine contenant un mot commençant par « tout ».
bonjour tout le monde
il faut dire toutefois
Non correspondance : partout dans le monde
\<tout\> Chaine contenant le mot « tout ».
bonjour tout le monde
Non correspondance : partout dans le monde. il faut dire toutefois
[0-9][0-9]\.[0-9] Chaine contenant 2 chiffres suivi du caractère . (point) suivi d’un chiffre.
4576.45

 

Les classes de caractères

[[:alnum:]] toutes les lettres et les chiffres
[[:alpha:]] toutes les lettres
[[:lower:]] toutes les lettres minuscules
[[:upper:]] toutes les lettres majuscule
[[:digit:]] tous les chiffres
[[:graph:]] tous les caractères imprimables ( [:alnum:] + [:punc:] ), sauf les blancs ( [:space:] )
[[:print:]] tous les caractères imprimables, y compris les blancs horizontaux ( [:alnum:] + [:punc:] + [:blank:] )
[[:blank:]] tous les blancs horizontaux (espaces et tabulations \t)
[[:space:]] tous les blancs verticaux (saut de ligne \n, retour chariot \r, tabulation verticale \v) et horizontaux (espaces et tabulations \t)
[[:punct:]] tous les caractères de ponctuation (" # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~.)
[[:xdigit:]] tous les chiffres hexadécimaux
[[:cntrl:]] tous les caractères de contrôle (donc y compris \r, \n, \t et \v)
Fermer le menu
%d blogueurs aiment cette page :