Systèmes de type Linux et UNIX, toutes les informations de configuration du système sont stockées et manipulées sous forme de texte brut. Ainsi, la recherche de texte serait une tâche très courante pour l'édition et l'analyse des journaux.
La commande grep permet de rechercher un texte ou une chaîne dans un fichier ou depuis la console de sortie d'une commande, pour un terme ou un modèle correspondant à des expressions régulières. Lorsque grep trouve une correspondance dans une ligne, il copie les résultats dans l'écran, c'est-à-dire stdout.
Dans ce didacticiel, nous apprenons à utiliser la commande grep avec des exemples pratiques.
Commande Grep
Vérifions la syntaxe de la commande grep avant de commencer à expliquer son utilisation.
grep [OPTIONS] PATTERN [FILE...]
Nous discuterons en détail des options et des modèles de grep les plus courants que nous pouvons utiliser pour la recherche.
Comment rechercher une chaîne dans un fichier
Dans l'exemple ci-dessous, grep recherche dans le fichier /etc/passwd la chaîne 'root' et redirige la sortie vers stdout.
$ grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
Rechercher du texte dans plusieurs fichiers
Vous pouvez rechercher du texte spécifique dans plusieurs fichiers à l'aide de la commande suivante :
$ grep "root" /etc/passwd /etc/group
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
/etc/group:root:x:0:root
/etc/group:bin:x:1:root,bin,daemon
/etc/group:daemon:x:2:root,bin,daemon
/etc/group:sys:x:3:root,bin,adm
/etc/group:adm:x:4:root,adm,daemon
/etc/group:disk:x:6:root
/etc/group:wheel:x:10:root
Recherche grep insensible à la casse
Options -i
recherche insensiblement la casse de la chaîne/du modèle donné.
Dans les exemples suivants, grep correspond à tous les mots tels que "hal", "HAL" insensible à la casse :
$ grep -i HAL /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
Recherche récursive
La recherche récursive est réalisée en utilisant -r
option qui recherchera récursivement tous les fichiers en sautant les liens symboliques. Si vous souhaitez inclure des liens symboliques, utilisez -R
.
Dans l'exemple suivant, la commande grep recherchera la chaîne 'ngnix' dans tous les fichiers à l'intérieur de /var
répertoire.
$ grep -r nginx /var
Rechercher une chaîne dans la sortie de la commande (stdout)
Vous pouvez utiliser pipe la sortie d'une commande et grep pour le modèle à partir de sa sortie.
Dans l'exemple suivant, je recherche un fichier nommé 'backup' à l'aide de la commande ls
$ ls | grep backup
Ici, je fais plusieurs canaux et je recherche les processus 'docker' et 'apache' à partir de la commande ps.
$ ps -ef | grep docker | grep apache
Expressions régulières dans les fichiers
Les expressions régulières sont un modèle à faire correspondre pour chaque ligne d'entrée. Basic et Extended sont les deux expressions régulières utilisées par la commande grep.
Expression régulière de base
Par défaut, grep interprète le modèle comme une expression régulière de base.
Le symbole ^ (caret) - Le motif qui le suit doit apparaître au début de chaque ligne. Dans l'exemple suivant, la chaîne ^welcome ne correspondra que si elle apparaît au tout début d'une ligne.
$ grep “^welcome” filename
Expression régulière étendue
Utilisez -E
(ou --extended-regexp) si vous voulez que grep la comprenne comme une expression régulière étendue.
La commande suivante extraira tous les liens d'un fichier
$ grep –Eoi '<a[^>]+>.*</a>' filename
o
:Par défaut, grep imprime toute la ligne contenant le motif de recherche. Cette option indique à la commande grep d'imprimer uniquement les mots correspondants au lieu de la ligne entière.
i
:Cette option demande à la commande grep d'ignorer la casse lors de la correspondance du modèle.
Rechercher un mot complet à l'aide de grep
Le -w
(word-regexp) flag pour grep fera que l'expression donnée ne correspondra qu'à des mots entiers.
$ grep -iw "samba" /etc/samba/smb.conf
# This is the main Samba configuration file. You should read the
# here. Samba has a huge number of configurable options (perhaps too
# For a step to step guide on installing, configuring and using samba,
# read the Samba-HOWTO-Collection. This may be obtained from:
Afficher les lignes après la correspondance de chaîne
Le -A
option qui affiche le N
lignes après la correspondance de chaîne.
$ grep -A 2 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
Afficher les lignes avant la correspondance de chaîne
Nous pouvons utiliser -B
possibilité d'afficher N lignes avant la chaîne pour un fichier donné
$ grep -B 2 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
--
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
Rechercher plusieurs chaînes
Nous pouvons rechercher plusieurs modèles ou chaînes en utilisant l'opérateur OU |
et \|
. -E
(extended-regexp) contrôle si vous devez échapper certains caractères spéciaux. -e
est strictement le drapeau pour indiquer le modèle que vous voulez comparer.
Exemple 1 :utilisation de l'option -E
$ ls | grep -E “li|ovo”
linux24
ovo8_linux24.sh
Ou
$ grep -E "foo|bar" *.txt
Exemple 2 :sans -E
$ ls | grep ‘li\|ovo’
linux24
ovo8_linux24.sh
Ou
$ grep "foo\|soul\|bar" *.txt
Exclure un fichier spécifique de la recherche
Vous pouvez utiliser l'option -v pour ignorer la recherche. La commande suivante recherchera la chaîne 'error' dans tous les fichiers sauf 'syslog.log'
$ grep -r error * | grep -v ‘/\syslog.log/’
Conclusion
Dans ce didacticiel, nous avons appris à utiliser la commande grep pour rechercher du texte dans des fichiers. J'espère que vous avez apprécié cette lecture et n'hésitez pas à laisser vos suggestions dans la section des commentaires ci-dessous.