Le grep
La commande signifie "impression d'expression régulière globale", et c'est l'une des commandes les plus puissantes et les plus couramment utilisées sous Linux.
grep
recherche dans un ou plusieurs fichiers d'entrée les lignes qui correspondent à un modèle donné et écrit chaque ligne correspondante sur la sortie standard. Si aucun fichier n'est spécifié, grep
lit à partir de l'entrée standard, qui est généralement la sortie d'une autre commande.
Dans cet article, nous allons vous montrer comment utiliser le grep
commande à travers des exemples pratiques et des explications détaillées des grep
GNU les plus courants options.
grep
Syntaxe de commande #
La syntaxe du grep
commande est la suivante :
grep [OPTIONS] PATTERN [FILE...]
Les éléments entre crochets sont facultatifs.
OPTIONS
- Zéro ou plusieurs options. Grep inclut un certain nombre d'options qui contrôlent son comportement.PATTERN
- Modèle de recherche.FILE
- Zéro ou plusieurs noms de fichiers d'entrée.
Pour pouvoir rechercher le fichier, l'utilisateur exécutant la commande doit avoir un accès en lecture au fichier.
Rechercher une chaîne dans les fichiers #
L'utilisation la plus élémentaire de grep
commande est de rechercher une chaîne (texte) dans un fichier.
Par exemple, pour afficher toutes les lignes contenant la chaîne bash
depuis le /etc/passwd
fichier, vous exécuterez la commande suivante :
grep bash /etc/passwd
Le résultat devrait ressembler à ceci :
root:x:0:0:root:/root:/bin/bash
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash
Si la chaîne contient des espaces, vous devez la placer entre guillemets simples ou doubles :
grep "Gnome Display Manager" /etc/passwd
Inverser la correspondance (exclure) #
Pour afficher les lignes qui ne correspondent pas à un motif, utilisez le -v
( ou --invert-match
).
Par exemple, pour imprimer les lignes qui ne contiennent pas la chaîne nologin
vous utiliseriez :
grep -v nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
colord:x:124:124::/var/lib/colord:/bin/false
git:x:994:994:git daemon user:/:/usr/bin/git-shell
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash
Utilisation de Grep pour filtrer la sortie d'une commande #
La sortie d'une commande peut être filtrée avec grep
à travers la tuyauterie, et seules les lignes correspondant à un motif donné seront imprimées sur le terminal.
Par exemple, pour savoir quels processus sont en cours d'exécution sur votre système en tant qu'utilisateur www-data
vous pouvez utiliser le ps
suivant commande :
ps -ef | grep www-data
www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www
root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data
www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process
www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process
Vous pouvez également enchaîner plusieurs tuyaux sur commande. Comme vous pouvez le voir dans la sortie ci-dessus, il y a aussi une ligne contenant le grep
processus. Si vous ne voulez pas que cette ligne soit affichée, passez la sortie à un autre grep
exemple comme indiqué ci-dessous.
ps -ef | grep www-data | grep -v grep
www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www
www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process
www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process
Recherche récursive #
Pour rechercher récursivement un modèle, invoquez grep
avec le -r
option (ou --recursive
). Lorsque cette option est utilisée grep
recherchera dans tous les fichiers du répertoire spécifié, en ignorant les liens symboliques rencontrés de manière récursive.
Pour suivre tous les liens symboliques, au lieu de -r
, utilisez le -R
option (ou --dereference-recursive
).
Voici un exemple montrant comment rechercher la chaîne linuxize.com
dans tous les fichiers à l'intérieur du /etc
répertoire :
grep -r linuxize.com /etc
La sortie inclura les lignes correspondantes précédées du chemin d'accès complet au fichier :
/etc/hosts:127.0.0.1 node2.linuxize.com
/etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;
Si vous utilisez le -R
option, grep
suivra tous les liens symboliques :
grep -R linuxize.com /etc
Notez la dernière ligne de la sortie ci-dessous. Cette ligne n'est pas imprimée lorsque grep
est invoqué avec -r
parce que les fichiers à l'intérieur des sites-enabled
de Nginx répertoire sont des liens symboliques vers les fichiers de configuration à l'intérieur du sites-available
répertoire.
/etc/hosts:127.0.0.1 node2.linuxize.com
/etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;
/etc/nginx/sites-enabled/linuxize.com: server_name linuxize.com www.linuxize.com;
Afficher uniquement le nom de fichier #
Pour supprimer le grep
par défaut afficher et imprimer uniquement les noms des fichiers contenant le motif correspondant, utilisez le -l
( ou --files-with-matches
).
La commande ci-dessous recherche dans tous les fichiers se terminant par .conf
dans le répertoire de travail courant et imprime uniquement les noms des fichiers contenant la chaîne linuxize.com
:
grep -l linuxize.com *.conf
La sortie ressemblera à ceci :
tmux.conf
haproxy.conf
Le -l
L'option est généralement utilisée en combinaison avec l'option récursive -R
:
grep -Rl linuxize.com /tmp
Recherche insensible à la casse #
Par défaut, grep
est sensible à la casse. Cela signifie que les caractères majuscules et minuscules sont traités comme distincts.
Pour ignorer la casse lors de la recherche, appelez grep
avec le -i
option (ou --ignore-case
).
Par exemple, lors de la recherche de Zebra
sans aucune option, la commande suivante n'affichera aucune sortie, c'est-à-dire qu'il y a des lignes correspondantes :
grep Zebra /usr/share/words
Mais si vous effectuez une recherche insensible à la casse en utilisant le -i
option, il correspondra à la fois aux lettres majuscules et minuscules :
grep -i Zebra /usr/share/words
Spécifier "Zebra" correspondra à "zebra", "ZEbrA" ou toute autre combinaison de lettres majuscules et minuscules pour cette chaîne.
zebra
zebra's
zebras
Rechercher des mots complets #
Lors de la recherche d'une chaîne, grep
affichera toutes les lignes où la chaîne est incorporée dans des chaînes plus grandes.
Par exemple, si vous recherchez "gnu", toutes les lignes où "gnu" est incorporé dans des mots plus longs, tels que "cygnus" ou "magnum" seront recherchées :
grep gnu /usr/share/words
cygnus
gnu
interregnum
lgnu9d
lignum
magnum
magnuson
sphagnum
wingnut
Pour renvoyer uniquement les lignes où la chaîne spécifiée est un mot entier (entouré de caractères non verbaux), utilisez le -w
( ou --word-regexp
).
a-z
, A-Z
, et 0-9
) et des traits de soulignement (_
). Tous les autres caractères sont considérés comme des caractères non verbaux.
Si vous exécutez la même commande que ci-dessus, y compris le -w
option, le grep
La commande renverra uniquement les lignes où gnu
est inclus en tant que mot séparé.
grep -w gnu /usr/share/words
gnu
Afficher les numéros de ligne #
Le -n
( ou --line-number
) l'option indique grep
pour afficher le numéro de ligne des lignes contenant une chaîne qui correspond à un modèle. Lorsque cette option est utilisée, grep
imprime les correspondances sur la sortie standard préfixée par le numéro de ligne.
Par exemple pour afficher les lignes du /etc/services
fichier contenant la chaîne bash
précédé du numéro de ligne correspondant, vous pouvez utiliser la commande suivante :
grep -n 10000 /etc/services
La sortie ci-dessous nous montre que les correspondances se trouvent sur les lignes 10423 et 10424.
10423:ndmp 10000/tcp
10424:ndmp 10000/udp
Compter les correspondances #
Pour imprimer un nombre de lignes correspondantes sur la sortie standard, utilisez le -c
( ou --count
).
Dans l'exemple ci-dessous, nous comptons le nombre de comptes qui ont /usr/bin/zsh
comme une coque.
regular expression
grep -c '/usr/bin/zsh' /etc/passwd
4
Mode silencieux #
Le -q
(ou --quiet
) indique grep
pour fonctionner en mode silencieux pour ne rien afficher sur la sortie standard. Si une correspondance est trouvée, la commande se termine avec le statut 0
. Ceci est utile lors de l'utilisation de grep
dans les scripts shell où vous souhaitez vérifier si un fichier contient une chaîne et effectuer une certaine action en fonction du résultat.
Voici un exemple d'utilisation de grep
en mode silencieux comme commande de test dans un if
déclaration :
if grep -q PATTERN filename
then
echo pattern found
else
echo pattern not found
fi
Expression régulière de base #
GNU Grep a trois ensembles de fonctionnalités d'expressions régulières, Basic, Extended et Perl-compatible.
Par défaut, grep
interprète le modèle comme une expression régulière de base où tous les caractères, à l'exception des méta-caractères, sont en fait des expressions régulières qui se correspondent.
Vous trouverez ci-dessous une liste des méta-caractères les plus couramment utilisés :
-
Utilisez le
^
(caret) pour correspondre à l'expression au début d'une ligne. Dans l'exemple suivant, la chaînekangaroo
ne correspondra que s'il se produit au tout début d'une ligne.grep "^kangaroo" file.txt
-
Utilisez le
$
(dollar) pour correspondre à l'expression à la fin d'une ligne. Dans l'exemple suivant, la chaînekangaroo
ne correspondra que s'il se produit à la toute fin d'une ligne.grep "kangaroo$" file.txt
-
Utilisez le
.
(point) pour correspondre à n'importe quel caractère unique. Par exemple, pour faire correspondre tout ce qui commence parkan
comporte alors deux caractères et se termine par la chaîneroo
, vous pouvez utiliser le modèle suivant :grep "kan..roo" file.txt
-
Utilisez
[ ]
(crochets) pour correspondre à n'importe quel caractère unique entre crochets. Par exemple, trouvez les lignes qui contiennentaccept
ou "accent
, vous pouvez utiliser le modèle suivant :grep "acce[np]t" file.txt
-
Utilisez
[^ ]
pour correspondre à n'importe quel caractère unique qui n'est pas entre crochets. Le modèle suivant correspondra à toute combinaison de chaînes contenantco(any_letter_except_l)a
, commecoca
,cobalt
et ainsi de suite, mais ne correspondra pas aux lignes contenantcola
,grep "co[^l]a" file.txt
Pour échapper à la signification spéciale du caractère suivant, utilisez le \
(barre oblique inverse).
Expressions régulières étendues #
Pour interpréter le modèle comme une expression régulière étendue, utilisez le -E
( ou --extended-regexp
) option. Les expressions régulières étendues incluent tous les méta-caractères de base, ainsi que des méta-caractères supplémentaires pour créer des modèles de recherche plus complexes et plus puissants. Voici quelques exemples :
-
Faites correspondre et extrayez toutes les adresses e-mail d'un fichier donné :
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt
-
Faites correspondre et extrayez toutes les adresses IP valides d'un fichier donné :
grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt
Le -o
L'option est utilisée pour imprimer uniquement la chaîne correspondante.
Rechercher plusieurs chaînes (modèles) #
Deux modèles de recherche ou plus peuvent être joints à l'aide de l'opérateur OU |
.
Par défaut, grep
interprète le modèle comme une expression régulière de base où les méta-caractères tels que |
perdent leur signification particulière et leurs versions avec barre oblique inversée doivent être utilisées.
Dans l'exemple ci-dessous, nous recherchons toutes les occurrences des mots fatal
, error
, et critical
dans le fichier Nginx logerror :
grep 'fatal\|error\|critical' /var/log/nginx/error.log
Si vous utilisez l'option d'expression régulière étendue -E
, puis l'opérateur |
ne doit pas être échappé, comme indiqué ci-dessous :
grep -E 'fatal|error|critical' /var/log/nginx/error.log
Imprimer les lignes avant une correspondance #
Pour imprimer un nombre spécifique de lignes avant de faire correspondre les lignes, utilisez le -B
( ou --before-context
).
Par exemple, pour afficher cinq lignes de contexte avant les lignes correspondantes, vous utiliserez la commande suivante :
grep -B 5 root /etc/passwd
Imprimer les lignes après une correspondance #
Pour imprimer un nombre spécifique de lignes après les lignes correspondantes, utilisez le -A
( ou --after-context
).
Par exemple, pour afficher cinq lignes de contexte de fin après les lignes correspondantes, vous utiliserez la commande suivante :
grep -A 5 root /etc/passwd
Conclusion #
Le grep
La commande vous permet de rechercher un modèle à l'intérieur des fichiers. Si une correspondance est trouvée, grep imprime les lignes contenant le motif spécifié.
Il y a beaucoup plus à apprendre sur Grep sur la page du manuel de l'utilisateur de Grep.
Si vous avez des questions ou des commentaires, n'hésitez pas à laisser un commentaire.