A quoi sert grep et egrep

Il est parfois utile de rechercher des chaines de caractères dans un fichier ou même dans la sortie standard de notre terminal. Grep permet cela facilement.

Rechercher une suite de caractères dans un fichier :

 > # grep ma_recherche toto.txt
 ma_recherche

Il est également possible de faire la recherche sur tous les fichiers présents dans le répertoire :

 > # grep ma_re *
grep: rep: Is a directory
toto.txt:ma_recherche

Rechercher une suite de caractère dans la sortie standard du terminal

Il est possible également d’utiliser grep pour filtrer les résultats donnés par la sortie standard de notre terminal. Pour cela, nous utilisons grep en sortie de la commande. Pour cela, nous utilisons le caractère “|” (pipe).

L’utilisation reste alors la même que précédemment.

 > # cat toto.txt |grep ma_
ma_recherche

Ou alors :

 > # ls -l|grep toto
-rw-r--r--  1 root root      13 Jan 27 14:29 toto.txt

Recherche en utilisant les REGEX

Dans des contexts un peu plus compliqués, nous pouvons rechercher par exemple des schémas de chaines de caractères plutôt que des chaines précises. Par exemple, si je souhaite connaitre la taille de tous les fichiers et répertoires de l’emplacement où je suis, je peux utiliser la commande “du -sh *”.

 > # du -sh *
3.1M    anaconda
15M     audit
0       boot.log
8.0K    boot.log-20210120
8.0K    boot.log-20210121
8.0K    boot.log-20210306
8.0K    boot.log-20210421
8.0K    boot.log-20210623
8.0K    boot.log-20210707
8.0K    boot.log-20210915
0       btmp
0       btmp-20220101
0       chrony
32K     cron
48K     cron-20220102
48K     cron-20220109
48K     cron-20220116
48K     cron-20220123
496K    dnf.librepo.log
1.1M    dnf.librepo.log.1
1.0M    dnf.librepo.log.2
140K    dnf.librepo.log-20210530
136K    dnf.librepo.log-20210606
140K    dnf.librepo.log-20210613
144K    dnf.librepo.log-20210620
1.1M    dnf.librepo.log.3

J’obtiens alors une liste plus ou moins longue, qui sera fastidieuse à analyser. Je vais donc rechercher uniquement les fichiers les plus volumineux (ici les fichiers > à 1M) :

 > # du -sh * |grep -E  '^([0-9].[0-9])M'
3.1M    anaconda
1.1M    dnf.librepo.log.1
1.0M    dnf.librepo.log.2
1.1M    dnf.librepo.log.3
1.0M    dnf.log.1
1.1M    dnf.log.2
1.1M    dnf.log.3
1.1M    dnf.log.4

En utilisant l’option “-E”, nous pouvons alors passer en paramètre une expression régulière. Ici, nous recherchons le schéma suivant : En début de ligne (^) les nombres décimaux [0-0].[0-9] qui sont imédiatement suivi de la lettre “M”.

Notons que la commande “egrep” remplace “grep -E”.