Exigences | Linux/Unix/macOS |
Privilèges de la racine | Non |
Niveau de difficulté | Facile |
Catégorie | Recherche |
Temps de lecture estimé | 9 minutes |
Table des matières ↓
|
Le saviez-vous ?
Le nom "grep" dérive de la commande utilisée pour effectuer une opération similaire, à l'aide de l'éditeur de texte ed d'Unix/Linux :
g/re/p
Les utilitaires grep constituent une famille qui comprend grep, grep -E (anciennement egrep), et grep -F (formellement fgrep) pour la recherche de fichiers. Pour la plupart des cas d'utilisation, fgrep est suffisant en raison de sa rapidité et du fait qu'il ne recherche que des chaînes de caractères et des mots. Cependant, il est facile de taper grep. Il s'agit donc d'un choix personnel.
Exemples de commandes grep sous Linux et Unix
Vous trouverez ci-dessous des explications sur les commandes standard de grep, accompagnées d'exemples, pour vous aider à démarrer avec grep sous Linux, macOS et Unix :
- Recherchez toute ligne qui contient le mot dans le nom du fichier sur Linux :
NULLgrep mot nom de fichier - Effectuez une recherche insensible à la casse pour le mot "bar" dans Linux et Unix :
NULLgrep -i bar file1 - Recherchez le mot "httpd" dans tous les fichiers du répertoire actuel et de tous ses sous-répertoires sous Linux :
NULLgrep -R httpd . - Recherchez et affichez le nombre total de fois où la chaîne "nixcraft" apparaît dans un fichier nommé frontpage.md :
NULLgrep -c nixcraft frontpage.md
Voyons toutes les commandes et options en détail.
Syntaxe
La syntaxe est la suivante :
grep 'word' filename # Interpret PATTERNS as fixed strings, not regular expressions (regex) when fgrep used. grep -F 'word-to-search' file.txt grep -F 'pattern' filename grep 'word' file1 file2 file3 grep 'string1 string2' filename cat otherfile | grep 'something' command | grep 'something' command option1 | grep 'data' grep --color 'data' fileName grep [-options] pattern filename grep -F [-options] words file
Comment utiliser grep pour rechercher un fichier sous Linux ?
Rechercher dans le fichier /etc/passswd un utilisateur nommé 'boo', entrer :
$ grep boo /etc/passwd
Exemples de résultats :
foo:x:1000:1000:boo,,,:/home/boo:/bin/ksh
Nous pouvons utiliser fgrep/grep pour trouver toutes les lignes d'un fichier qui contiennent un mot particulier. Par exemple, pour lister toutes les lignes d'un fichier nommé address.txt dans le répertoire courant qui contiennent le mot "California", exécutez :
$ grep -F California address.txt
Veuillez noter que la commande ci-dessus renvoie également les lignes où "California" fait partie d'autres mots, tels que "Californication" ou "Californian". Passez donc la commande -w avec la commande grep/fgrep pour obtenir uniquement les lignes où "California" est inclus comme un mot entier :
$ grep -F -w California address.txt
Vous pouvez forcer grep à ignorer la casse des mots, c'est-à-dire faire correspondre boo, Boo, BOO et toute autre combinaison avec l'option -i option. Par exemple, tapez la commande suivante :
$ grep -i boo /etc/passwd
La dernière grep -i boo /etc/passwd peut être exécuté comme suit en utilisant aussi la commande cat :
$ cat /etc/passwd | grep -i boo
Comment utiliser grep de manière récursive
Vous pouvez effectuer une recherche récursive, c'est-à-dire lire tous les fichiers sous chaque répertoire pour une chaîne de caractères "192.168.1.5".
$ grep -r 192.168.1.5 /etc/
OU
$ grep -R 192.168.1.5 /etc/
Exemples de résultats :
/etc/ppp/options:# ms-wins 192.168.1.50 /etc/ppp/options:# ms-wins 192.168.1.51 /etc/NetworkManager/system-connections/Wired connection 1:addresses1=192.168.1.5;24;192.168.1.2;
Vous verrez le résultat pour 192.168.1.5 sur une ligne séparée précédée du nom du fichier (tel que /etc/ppp/options) dans lequel il a été trouvé. L'inclusion des noms de fichiers dans les données de sortie peut être supprimée en utilisant la commande -h option comme suit :
$ grep -h -R 192.168.1.5 /etc/
OU
$ grep -hR 192.168.1.5 /etc/
Exemples de résultats :
# ms-wins 192.168.1.50 # ms-wins 192.168.1.51 addresses1=192.168.1.5;24;192.168.1.2;
Comment utiliser grep pour rechercher uniquement des mots
Lorsque vous recherchez boo, grep correspondra à fooboo, boo123, barfoo35 et plus encore. Vous pouvez forcer la commande grep à ne sélectionner que les lignes contenant des correspondances qui forment des mots entiers, c'est-à-dire ne faire correspondre que le mot boo :
$ grep -w boo file
Comment utiliser grep pour rechercher 2 mots différents
Utilisez la commande egrep comme suit :
$ grep -E -w word1|word2 /path/to/file
Le site -E active les expressions régulières étendues. N'utilisez pas la syntaxe dépréciée suivante :
$ egrep -w word1|word2 /path/to/file
Ignorer le cas
Nous pouvons forcer grep à ignorer les distinctions de casse dans les motifs et les données. Par exemple, lorsque je recherche le mot "bar", il correspondra à "BAR", "Bar", "BaR" et ainsi de suite :
$ grep -i bar /path/to/file
Dans cet exemple, je vais inclure tous les sous-répertoires dans une recherche :
$ grep -r -i main ~/projects/
Comment puis-je compter les lignes lorsque les mots ont été appariés ?
La commande grep peut indiquer le nombre de fois où le motif a été trouvé pour chaque fichier à l'aide de la commande -c (compte) option :
$ grep -c word /path/to/file
Passez le -n pour faire précéder chaque ligne de sortie du numéro de la ligne dans le fichier texte à partir duquel elle a été obtenue :
$ grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash 1042:rootdoor:x:0:0:rootdoor:/home/rootdoor:/bin/csh 3319:initrootapp:x:0:0:initrootapp:/home/initroot:/bin/ksh
Force grep invert match
Vous pouvez utiliser -v pour imprimer inverse la correspondance ; c'est-à-dire qu'elle ne correspond qu'aux lignes qui ne contiennent pas le mot donné. Par exemple, imprimer toutes les lignes qui ne contiennent pas le mot bar :
$ grep -v bar /path/to/file
$ grep -v ^root /etc/passwd
Afficher les lignes avant et après le match
Vous voulez voir les lignes avant vos matchs ? Essayez de passer le -B au grep :
$ grep -B NUM word file
$ grep -B 3 foo file1
De même, affichez les lignes après vos correspondances en passant la commande -A au grep :
$ grep -A NUM string /path/to/file
$ grep -A 4 dropped /var/log/ufw.log
Nous pouvons combiner ces deux options pour obtenir les résultats les plus significatifs :
$ grep -C 4 -B 5 -A 6 --color error-code /var/log/httpd/access_log
Voici un exemple de script shell qui récupère les urls de téléchargement du noyau Linux :
....... ... _out="/tmp/out.$$" curl -s https://www.kernel.org/ > "$_out" ####################### ## grep -A used here ## ####################### url="$(grep -A 2 '' ${_out} | grep -Eo '(http|https)://[^/"]+.*xz')" gpgurl="${url/tar.xz/tar.sign}" notify-send "A new kernel version ($remote) has been released." echo "* Downloading the Linux kernel (new version) ..." wget -qc "$url" -O "${dldir}/${file}" wget -qc "$gpgurl" -O "${dldir}/${gpgurl##*/}" ..... ..
Tuyaux UNIX / Linux
commande grep souvent utilisée avec les pipes shell. Dans cet exemple, affichez le nom des périphériques de disque dur :
# dmesg | grep -E (s|h)d[a-z]
Affiche le nom du modèle de processeur :
# cat /proc/cpuinfo | grep -i Model
Cependant, la commande ci-dessus peut également être utilisée comme suit sans pipe shell :
# grep -i Model /proc/cpuinfo
model : 30 model name : Intel(R) Core(TM) i7 CPU Q 820 @ 1.73GHz model : 30 model name : Intel(R) Core(TM) i7 CPU Q 820 @ 1.73GHz
Une de mes utilisations préférées de la commande grep ou egrep pour filtrer la sortie de la commande yum/dpkg/apt/apt-get :
# dpkg --list | grep linux-image
# yum search php | grep gd
# apt search maria | grep -E server|client
Les commandes grep de Linux expliquées avec des exemples de shell pipes
Comment lister uniquement les noms des fichiers correspondants ?
Utilisez le -l option pour lister les noms de fichiers dont le contenu mentionne main() :
$ grep -l main *.c
OU
$ grep -Rl main /path/to/project/dir/
Option de couleurs
Enfin, nous pouvons forcer grep à afficher la sortie en couleurs, entrez :
$ grep --color vivek /etc/passwd
La commande Grep en action
GREP_COLOR=1;35 grep --color=always vivek /etc/passwd
En plus de la couleur rouge par défaut, nous pouvons maintenant définir des couleurs en utilisant la variable shell GREP_COLOR. Les différentes couleurs nous aident énormément dans la recherche visuelle.
Sauvegarder la sortie de grep dans un fichier
Disons que vous souhaitez rechercher le mot-clé acl et enregistrer cette sortie dans un fichier nommé my-acl.txt, puis vous devez l'exécuter :
$ grep acl squid.conf > my-acl.txt
Nous pouvons trouver la recherche d'accord et limiter la recherche aux mots commençant par le mot clé nommé acl :
grep -w ^acl squid.conf > my-acl.txt
Visualisez la sortie finale en utilisant la commande cat/more ou less :
$ cat my-acl.txt
Recherche de caractères spéciaux à l'aide de grep
Vous voulez chercher [ ou NULL ou ^ caractères spéciaux en utilisant grep ? Vous pouvez demander à grep de traiter votre entrée comme une chaîne fixe en utilisant -F option ou ou fgrep commande. Par exemple :
# correspond à '[xyz]' dans le nom du fichier
fgrep '[xyz]' filename #deprecated syntax grep -F '[xyz]' filename
Utilisez le NULL comme caractère d'échappement
Pour faire correspondre un caractère spécial à egrep ou à grep -E, a une barre oblique inverse (NULL) devant le caractère. Il est généralement plus simple d'utiliser grep -F lorsque vous n'avez pas besoin d'une correspondance particulière. Par exemple, essayez de faire correspondre foo en mettant NULL avant NULL:
grep -E ''foo'' input
Dans l'utilisation du tri, le fgrep ou grep -F lorsque vous n'avez pas besoin d'utiliser la correspondance des motifs à l'aide de regex.
Ensemble de métacaractères pour une expression régulière qui doivent être échappés si vous souhaitez les faire correspondre.
Voir la commande egrep pour plus d'informations et d'exemples sur les regex :
. ^ $ [ * { } ( ) . [ $ [ * { } ( )
Les métacaractères des expressions régulières étendues sont :
. ^ $ [ * + ? { } | ( )
Suppression des messages d'erreur
Vous pouvez demander à grep de ne pas afficher les erreurs "No such file or directory" ou "Permission denied" à l'écran en passant la commande -s option. Par exemple :
$ grep -R -i -s regex /etc/
$ grep -R -i -s vivek /etc/
Le site -s ou --no-messages est utilisé pour supprimer les messages d'erreur concernant les fichiers inexistants ou illisibles.
Conclusion
La commande grep est très polyvalente et beaucoup de nouveaux utilisateurs de Linux ou Unix la trouvent compliquée. Par conséquent, je vous suggère de lire le manuel grep également en ligne sur GNU.org. Résumons la plupart des options d'importation :
-i | Ignorer les distinctions de casse sous Linux et Unix |
-w | Forcez le PATTERN à ne correspondre qu'à des mots entiers |
-v | Sélectionner les lignes non concordantes |
-n | Imprimer le numéro de ligne avec les lignes de sortie |
-h | Supprime le préfixe du nom de fichier Unix en sortie |
-H | Imprimer le nom du fichier avec les lignes de sortie |
-r | Recherche récurrente de répertoires sous Linux |
-R | Comme -r mais en suivant tous les liens symboliques |
-l | Imprimer uniquement les noms des FICHIERS avec les lignes sélectionnées |
-c | Imprimer seulement un compte de lignes sélectionnées par FICHIER |
--color | Afficher le motif assorti en couleurs |
-m NUMBER | Arrêter la commande grep NUMÉRO des lignes sélectionnées |
-o | Afficher uniquement les parties correspondantes des lignes |
-B NUMBER | Afficher NUMÉRO de lignes du contexte avant la correspondance |
-A NUMBER | Afficher NUMÉRO de lignes après le contexte correspondant |
-C NUMBER | Afficher NUMÉRO de lignes du contexte de sortie |
-s | Dites à grep de ne pas afficher à l'écran les erreurs "No such file or directory" ou "Permission denied". |
Si vous avez apprécié le tutoriel grep, vous aimerez peut-être lire notre tutoriel "Expressions régulières dans Grep". Lisez la page de manuel de la commande grep en tapant la commande man suivante :
$ man grep
Essayez également la commande help pour en savoir plus sur l'utilisation de grep. Par exemple, consultez la commande grep dans le terminal Linux et voyez ce que fait le '-Eou-iL'option ' le fait :
$ grep --help | grep -E -w -- -(E|i)