Filtrage de lignes : grep

La commande grep recherche une chaine de caractères dans un ou plusieurs fichiers textes et affiche à l'écran les lignes contenant cette chaine. La chaine recherchée est matérialisée par une expression régulière basique ERb (défaut) ou étendue ERe grâce à l'option -E.

Syntaxe

grep [options] expreg [fichiers...]
grep [options] -e expreg1 -e expreg2 [fichiers...]
grep [options] -f fichier_expreg [fichiers...]
Principales options :
-c affiche le nombre de lignes trouvées
-e permet de spécifier plusieurs expressions régulières
-E permet d'utiliser les ERe
-f permet de lire les expressions régulières à partir d'un fichier
-F permet de ne pas interpréter le motif de recherche comme une expression régulière
-i permet une recherche insensible à la casse
-l permet de seulement afficher les noms des fichiers contenant l'expression régulière recherchée
-n permet de numéroter les lignes trouvées
-q permet d'effectuer une recherche sans afficher le résultat à l'écran
-v permet une recherche ne contenant pas l'expression régulière
-w l'expression recherchée doit correspondre à un mot entier
-x l'expression recherchée doit correspondre à une ligne entière

Exemple

Utilisation du fichier depts2012.txt pour les exemples

$ cat depts2012.txt
REGION  DEP     CHEFLIEU        TNCC    NCC     NCCENR
82      01      01053   5       AIN     Ain
22      02      02408   5       AISNE   Aisne
83      03      03190   5       ALLIER  Allier
93      04      04070   4       ALPES-DE-HAUTE-PROVENCE Alpes-de-Haute-Provence
93      05      05061   4       HAUTES-ALPES    Hautes-Alpes
93      06      06088   4       ALPES-MARITIMES Alpes-Maritimes
82      07      07186   5       ARDECHE Ardèche
21      08      08105   4       ARDENNES        Ardennes
73      09      09122   5       ARIEGE  Ariège
21      10      10387   5       AUBE    Aube
91      11      11069   5       AUDE    Aude
73      12      12202   5       AVEYRON Aveyron
93      13      13055   4       BOUCHES-DU-RHONE        Bouches-du-Rhône
25      14      14118   2       CALVADOS        Calvados
83      15      15014   2       CANTAL  Cantal
54      16      16015   3       CHARENTE        Charente
54      17      17300   3       CHARENTE-MARITIME       Charente-Maritime
24      18      18033   2       CHER    Cher
74      19      19272   3       CORREZE Corrèze
94      2A      2A004   3       CORSE-DU-SUD    Corse-du-Sud
94      2B      2B033   3       HAUTE-CORSE     Haute-Corse
26      21      21231   3       COTE-D'OR       Côte-d'Or
53      22      22278   4       COTES-D'ARMOR   Côtes-d'Armor
74      23      23096   3       CREUSE  Creuse
72      24      24322   3       DORDOGNE        Dordogne
43      25      25056   2       DOUBS   Doubs
82      26      26362   3       DROME   Drôme
23      27      27229   5       EURE    Eure
24      28      28085   1       EURE-ET-LOIR    Eure-et-Loir
53      29      29232   2       FINISTERE       Finistère
91      30      30189   2       GARD    Gard
73      31      31555   3       HAUTE-GARONNE   Haute-Garonne
73      32      32013   2       GERS    Gers
72      33      33063   3       GIRONDE Gironde
91      34      34172   5       HERAULT Hérault
53      35      35238   1       ILLE-ET-VILAINE Ille-et-Vilaine
24      36      36044   5       INDRE   Indre
24      37      37261   1       INDRE-ET-LOIRE  Indre-et-Loire
82      38      38185   5       ISERE   Isère
43      39      39300   2       JURA    Jura
72      40      40192   4       LANDES  Landes
24      41      41018   0       LOIR-ET-CHER    Loir-et-Cher
82      42      42218   3       LOIRE   Loire
83      43      43157   3       HAUTE-LOIRE     Haute-Loire
52      44      44109   3       LOIRE-ATLANTIQUE        Loire-Atlantique
24      45      45234   2       LOIRET  Loiret
73      46      46042   2       LOT     Lot
72      47      47001   0       LOT-ET-GARONNE  Lot-et-Garonne
91      48      48095   3       LOZERE  Lozère
52      49      49007   0       MAINE-ET-LOIRE  Maine-et-Loire
25      50      50502   3       MANCHE  Manche
21      51      51108   3       MARNE   Marne
21      52      52121   3       HAUTE-MARNE     Haute-Marne
52      53      53130   3       MAYENNE Mayenne
41      54      54395   0       MEURTHE-ET-MOSELLE      Meurthe-et-Moselle
41      55      55029   3       MEUSE   Meuse
53      56      56260   2       MORBIHAN        Morbihan
41      57      57463   3       MOSELLE Moselle
26      58      58194   3       NIEVRE  Nièvre
31      59      59350   2       NORD    Nord
22      60      60057   5       OISE    Oise
25      61      61001   5       ORNE    Orne
31      62      62041   2       PAS-DE-CALAIS   Pas-de-Calais
83      63      63113   2       PUY-DE-DOME     Puy-de-Dôme
72      64      64445   4       PYRENEES-ATLANTIQUES    Pyrénées-Atlantiques
73      65      65440   4       HAUTES-PYRENEES Hautes-Pyrénées
91      66      66136   4       PYRENEES-ORIENTALES     Pyrénées-Orientales
42      67      67482   2       BAS-RHIN        Bas-Rhin
42      68      68066   2       HAUT-RHIN       Haut-Rhin
82      69      69123   2       RHONE   Rhône
43      70      70550   3       HAUTE-SAONE     Haute-Saône
26      71      71270   0       SAONE-ET-LOIRE  Saône-et-Loire
52      72      72181   3       SARTHE  Sarthe
82      73      73065   3       SAVOIE  Savoie
82      74      74010   3       HAUTE-SAVOIE    Haute-Savoie
11      75      75056   0       PARIS   Paris
23      76      76540   3       SEINE-MARITIME  Seine-Maritime
11      77      77288   0       SEINE-ET-MARNE  Seine-et-Marne
11      78      78646   4       YVELINES        Yvelines
54      79      79191   4       DEUX-SEVRES     Deux-Sèvres
22      80      80021   3       SOMME   Somme
73      81      81004   2       TARN    Tarn
73      82      82121   0       TARN-ET-GARONNE Tarn-et-Garonne
93      83      83137   2       VAR     Var
93      84      84007   0       VAUCLUSE        Vaucluse
52      85      85191   3       VENDEE  Vendée
54      86      86194   3       VIENNE  Vienne
74      87      87085   3       HAUTE-VIENNE    Haute-Vienne
41      88      88160   4       VOSGES  Vosges
26      89      89024   5       YONNE   Yonne
43      90      90010   0       TERRITOIRE_DE_BELFORT   Territoire de Belfort
11      91      91228   5       ESSONNE Essonne
11      92      92050   4       HAUTS-DE-SEINE  Hauts-de-Seine
11      93      93008   3       SEINE-SAINT-DENIS       Seine-Saint-Denis
11      94      94028   2       VAL-DE-MARNE    Val-de-Marne
11      95      95500   2       VAL-D'OISE      Val-d'Oise
01      971     97105   3       GUADELOUPE      Guadeloupe
02      972     97209   3       MARTINIQUE      Martinique
03      973     97302   3       GUYANE  Guyane
04      974     97411   0       LA_REUNION      La Réunion
06      976     97608   0       MAYOTTE Mayotte
$

Afficher la ligne contenant 85191

$ grep 85191 depts2012.txt
52      85      85191   3       VENDEE  Vendée
$

Utilisation d'une ERe et d'une recherche insensible à la casse

$ grep -E -i '(paris|vosges)' depts2012.txt
11      75      75056   0       PARIS   Paris
41      88      88160   4       VOSGES  Vosges
$

Afficher les lignes ne commençant pas par le chiffre 9

$ grep -v '^9' depts2012.txt
REGION  DEP     CHEFLIEU        TNCC    NCC     NCCENR
82      01      01053   5       AIN     Ain
22      02      02408   5       AISNE   Aisne
83      03      03190   5       ALLIER  Allier
82      07      07186   5       ARDECHE Ardèche
21      08      08105   4       ARDENNES        Ardennes
73      09      09122   5       ARIEGE  Ariège
21      10      10387   5       AUBE    Aube
73      12      12202   5       AVEYRON Aveyron
25      14      14118   2       CALVADOS        Calvados
83      15      15014   2       CANTAL  Cantal
54      16      16015   3       CHARENTE        Charente
54      17      17300   3       CHARENTE-MARITIME       Charente-Maritime
24      18      18033   2       CHER    Cher
74      19      19272   3       CORREZE Corrèze
26      21      21231   3       COTE-D'OR       Côte-d'Or
53      22      22278   4       COTES-D'ARMOR   Côtes-d'Armor
74      23      23096   3       CREUSE  Creuse
72      24      24322   3       DORDOGNE        Dordogne
43      25      25056   2       DOUBS   Doubs
82      26      26362   3       DROME   Drôme
23      27      27229   5       EURE    Eure
24      28      28085   1       EURE-ET-LOIR    Eure-et-Loir
53      29      29232   2       FINISTERE       Finistère
73      31      31555   3       HAUTE-GARONNE   Haute-Garonne
73      32      32013   2       GERS    Gers
72      33      33063   3       GIRONDE Gironde
53      35      35238   1       ILLE-ET-VILAINE Ille-et-Vilaine
24      36      36044   5       INDRE   Indre
24      37      37261   1       INDRE-ET-LOIRE  Indre-et-Loire
82      38      38185   5       ISERE   Isère
43      39      39300   2       JURA    Jura
72      40      40192   4       LANDES  Landes
24      41      41018   0       LOIR-ET-CHER    Loir-et-Cher
82      42      42218   3       LOIRE   Loire
83      43      43157   3       HAUTE-LOIRE     Haute-Loire
52      44      44109   3       LOIRE-ATLANTIQUE        Loire-Atlantique
24      45      45234   2       LOIRET  Loiret
73      46      46042   2       LOT     Lot
72      47      47001   0       LOT-ET-GARONNE  Lot-et-Garonne
52      49      49007   0       MAINE-ET-LOIRE  Maine-et-Loire
25      50      50502   3       MANCHE  Manche
21      51      51108   3       MARNE   Marne
21      52      52121   3       HAUTE-MARNE     Haute-Marne
52      53      53130   3       MAYENNE Mayenne
41      54      54395   0       MEURTHE-ET-MOSELLE      Meurthe-et-Moselle
41      55      55029   3       MEUSE   Meuse
53      56      56260   2       MORBIHAN        Morbihan
41      57      57463   3       MOSELLE Moselle
26      58      58194   3       NIEVRE  Nièvre
31      59      59350   2       NORD    Nord
22      60      60057   5       OISE    Oise
25      61      61001   5       ORNE    Orne
31      62      62041   2       PAS-DE-CALAIS   Pas-de-Calais
83      63      63113   2       PUY-DE-DOME     Puy-de-Dôme
72      64      64445   4       PYRENEES-ATLANTIQUES    Pyrénées-Atlantiques
73      65      65440   4       HAUTES-PYRENEES Hautes-Pyrénées
42      67      67482   2       BAS-RHIN        Bas-Rhin
42      68      68066   2       HAUT-RHIN       Haut-Rhin
82      69      69123   2       RHONE   Rhône
43      70      70550   3       HAUTE-SAONE     Haute-Saône
26      71      71270   0       SAONE-ET-LOIRE  Saône-et-Loire
52      72      72181   3       SARTHE  Sarthe
82      73      73065   3       SAVOIE  Savoie
82      74      74010   3       HAUTE-SAVOIE    Haute-Savoie
11      75      75056   0       PARIS   Paris
23      76      76540   3       SEINE-MARITIME  Seine-Maritime
11      77      77288   0       SEINE-ET-MARNE  Seine-et-Marne
11      78      78646   4       YVELINES        Yvelines
54      79      79191   4       DEUX-SEVRES     Deux-Sèvres
22      80      80021   3       SOMME   Somme
73      81      81004   2       TARN    Tarn
73      82      82121   0       TARN-ET-GARONNE Tarn-et-Garonne
52      85      85191   3       VENDEE  Vendée
54      86      86194   3       VIENNE  Vienne
74      87      87085   3       HAUTE-VIENNE    Haute-Vienne
41      88      88160   4       VOSGES  Vosges
26      89      89024   5       YONNE   Yonne
43      90      90010   0       TERRITOIRE_DE_BELFORT   Territoire de Belfort
11      91      91228   5       ESSONNE Essonne
11      92      92050   4       HAUTS-DE-SEINE  Hauts-de-Seine
11      93      93008   3       SEINE-SAINT-DENIS       Seine-Saint-Denis
11      94      94028   2       VAL-DE-MARNE    Val-de-Marne
11      95      95500   2       VAL-D'OISE      Val-d'Oise
01      971     97105   3       GUADELOUPE      Guadeloupe
02      972     97209   3       MARTINIQUE      Martinique
03      973     97302   3       GUYANE  Guyane
04      974     97411   0       LA_REUNION      La Réunion
06      976     97608   0       MAYOTTE Mayotte
$

Afficher les lignes commençant par un 0 ou se terminant par un s

$ grep -e '^0' -e 's$' depts2012.txt
93      05      05061   4       HAUTES-ALPES    Hautes-Alpes
93      06      06088   4       ALPES-MARITIMES Alpes-Maritimes
21      08      08105   4       ARDENNES        Ardennes
25      14      14118   2       CALVADOS        Calvados
43      25      25056   2       DOUBS   Doubs
73      32      32013   2       GERS    Gers
72      40      40192   4       LANDES  Landes
31      62      62041   2       PAS-DE-CALAIS   Pas-de-Calais
72      64      64445   4       PYRENEES-ATLANTIQUES    Pyrénées-Atlantiques
73      65      65440   4       HAUTES-PYRENEES Hautes-Pyrénées
91      66      66136   4       PYRENEES-ORIENTALES     Pyrénées-Orientales
11      75      75056   0       PARIS   Paris
11      78      78646   4       YVELINES        Yvelines
54      79      79191   4       DEUX-SEVRES     Deux-Sèvres
41      88      88160   4       VOSGES  Vosges
11      93      93008   3       SEINE-SAINT-DENIS       Seine-Saint-Denis
01      971     97105   3       GUADELOUPE      Guadeloupe
02      972     97209   3       MARTINIQUE      Martinique
03      973     97302   3       GUYANE  Guyane
04      974     97411   0       LA_REUNION      La Réunion
06      976     97608   0       MAYOTTE Mayotte
$

Afficher et numéroter les lignes commençant par 11

$ grep -n '^11' depts2012.txt
77:11   75      75056   0       PARIS   Paris
79:11   77      77288   0       SEINE-ET-MARNE  Seine-et-Marne
80:11   78      78646   4       YVELINES        Yvelines
93:11   91      91228   5       ESSONNE Essonne
94:11   92      92050   4       HAUTS-DE-SEINE  Hauts-de-Seine
95:11   93      93008   3       SEINE-SAINT-DENIS       Seine-Saint-Denis
96:11   94      94028   2       VAL-DE-MARNE    Val-de-Marne
97:11   95      95500   2       VAL-D'OISE      Val-d'Oise
$

Effectuer une recherche sans afficher le résultat. Afficher le code de retour de la commande pour vérifier l'état de la recherche.

$ grep -q '^11' depts2012.txt
$ echo $?
0
$

Afficher seulement le nombre de lignes trouvées

$ grep -c -e '^0' -e 's$' depts2012.txt
21
$

Rechercher un mot exact

$ grep COTE depts2012.txt # Sans l'option -w 2 lignes sont affichées
26      21      21231   3       COTE-D'OR       Côte-d'Or
53      22      22278   4       COTES-D'ARMOR   Côtes-d'Armor
$ grep -w COTE depts2012.txt # Avec l'option -w seule la ligne contenant le mot COTE s'affiche
26      21      21231   3       COTE-D'OR       Côte-d'Or
$

Afficher les lignes contenant au moins 2 caractères. Utilisation du fichier fic7 en exemple.

$ cat fic7
erytert
e
er
..
uhy
2
e_
34
546
$ grep '..' fic7
erytert
er
..
uhy
e_
34
546
$

Ne pas interpréter le motif comme une expression régulière.

$ grep -F '..' fic7
..
$

Rechercher les lignes ne contenant que des chiffres. Utilisation d'une ERe.

$ grep -E -x '[0-9]+' fic7 # Avec l'option -x
2
34
546
$ grep -E '^[0-9]+$' fic7 # Même résultat mais sans l'option -x
2
34
546
$

Utiliser un fichier pour rechercher les expressions régulières

$ cat rech.er
# Rechercher les lignes se terminant par la lettre t
t$
# Rechercher les lignes contenant uniquement des chiffres
^[0-9]+$
$ grep -E -f rech.er fic7
erytert
2
34
546
$

Utiliser grep derrière un tube pour rechercher un processus particulier.

$ ps -ef | grep apache2
root       302     1  0 06:18 ?        00:00:00 /usr/sbin/apache2 -k start
www-data   351   302  0 06:18 ?        00:00:00 /usr/sbin/apache2 -k start
www-data   352   302  0 06:18 ?        00:00:00 /usr/sbin/apache2 -k start
root      3783  3105  0 14:10 pts/0    00:00:00 grep --color=always apache2
$

Dans ce cas, la commande grep apparait également. L'utilisation de 2 tubes est donc nécessaire.

$ ps -ef | grep apache2 | grep -v grep # On demande à grep de ne pas afficher "grep"
root       302     1  0 06:18 ?        00:00:00 /usr/sbin/apache2 -k start
www-data   351   302  0 06:18 ?        00:00:00 /usr/sbin/apache2 -k start
www-data   352   302  0 06:18 ?        00:00:00 /usr/sbin/apache2 -k start
$

Etiquettes: 

Commentaires

Bonjour,
J'ai besoin de réaliser ceci:
Rechercher uniquement le nom des fichiers:
-parmi une liste de fichiers (disons tous ceux dont le nom commence par "sma")
-ceux qui contiennent une chaine du genre "la date de la veille au format "2018/21/08" suivi de " tata" par exemple "2018/11/18 tata"
- mais également ceux (qui ne respectent pas la condition précédente) qui contiennent simplement "toto"

donc pour la première liste j'ai :
grep -l $(date -d $(expr `date +%Y%m%d` - 1) +%Y/%m/%d)" tata" sma*.*

pour la seconde j'ai:
grep "toto" sma*.*

mais je n'arrive pas à faire un 'OR' qui prenne en compte les deux.... frustrant !

Bises

Si j'ai bien compris, ceci devrait faire l'affaire

$ grep -l -e 'toto' -e "$(date -d $(expr `date +%Y%m%d` - 1) +%Y/%m/%d" tata")" sma*.*

Bonne journée

Ajouter un commentaire

Filtered HTML

  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Tags HTML autorisés : <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.

Plain text

  • Aucune balise HTML autorisée.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
CAPTCHA
Cette question permet de s'assurer que vous êtes un utilisateur humain et non un logiciel automatisé de pollupostage.
CAPTCHA visuel
Entrez les caractères (sans espace) affichés dans l'image.