Commandes de base

grep : Afficher les lignes correspondant à un motif donné

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

Introduction



La commande grep est une commande Linux utilisée pour rechercher des chaînes de caractères

Cette commande fait partie de coreutils qui est disponible dans toutes les distributions Linux.

La syntaxe de la commande est la suivante :

Code BASH :
grep [options] [motif] [fichier...]


- motif : le motif ou l'expression régulière qu'on souhaite rechercher.
- fichier... : le(s) fichier(s) dans le(s)quel(s) on souhaite effectuer la recherche.

La commande grep lit l'entrée standard si aucun fichier n'est spécifié, elle s'utilisera donc parfois sous cette forme :

Code BASH :
commande | grep [options]  [motif] 


Il existe des variantes zgrep, bzgrep et xzgrep qui effectuent des recherches sur des fichiers compressés respectivement par gzip, bzip2 et xz.

Par défaut, le motif recherché est affiché en couleur (généralement en rouge) lorsque le résultat s'affiche sur le terminal.

Utiliser grep



L'utilisation basique de grep où on souhaite filtrer les lignes d'un fichier :

Code BASH :
grep NAME /etc/os-release


La sortie :
Code BASH :
NAME="Red Hat Enterprise Linux"
PRETTY_NAME="Red Hat Enterprise Linux 8.6 (Ootpa)"
CPE_NAME="cpe:/o:redhat:enterprise_linux:8::baseos"



On pourra utiliser grep pour filtrer la sortie standard :
Code BASH :
lspci | grep Ethernet


A noter que grep est sensible à la casse. L'option -i pemet d'ignorer la casse :
Code BASH :
grep -i name /etc/os-release


Grâce à l'option -n, on pourra avoir le numéro de ligne dans le fichier :
Code BASH :
grep -n NAME /etc/os-release

Exemple :
Code :
1:NAME="Red Hat Enterprise Linux"
7:PRETTY_NAME="Red Hat Enterprise Linux 8.6 (Ootpa)"
9:CPE_NAME="cpe:/o:redhat:enterprise_linux:8::baseos"


On pourra compter aussi le nombre de lignes correspondant à la recherche avec l'option -c :
Code BASH :
grep -c NAME /etc/os-release


On pourra aussi rechercher de manière récursive dans un dossier et ses sous dossiers avec l'option -r :
Code BASH :
grep -r UUID /etc


On pourra, dans le motif de recherche utiliser des expressions régulières simples:
Code BASH :
grep '^U' /etc/fstab


Cependant, dans le cas d'expressions régulières plus complexes, il sera nécessaire de préciser l'option -E (ici avec un choix entre deux expressions et choisir les lignes commençant par un U ou une barre oblique) :
Code BASH :
grep -E '(^U|^/)' /etc/fstab


Un truc intéressant, c'est l'option -v qui permet d'inverser le filtre de recherche. Je l'utilise par exemple pour afficher un fichier en excluant les commentaires (regexp vaut '^#') et les lignes vides (regexp vaut '^$') :
Code BASH :
grep -E -v '(^#|^$)' /etc/fstab


Enfin, dans les options que j'utilise souvent, on peut utiliser l'option -o qui n'affiche que le motif recherché dans la ligne trouvée (utile avec une Regexp).
Exemple ici, n'afficher que les adresses IPv4 du fichier hosts :

Code BASH :
grep -Eo '^([0-9])+.([0-9])+.([0-9])+.([0-9])+' /etc/hosts