Recherche de site Web

Comment utiliser grep pour rechercher des chaînes dans des fichiers sur le shell Linux


La commande GREP - un aperçu

La commande grep, qui signifie impression d'expression régulière globale, est l'une des commandes les plus polyvalentes dans un environnement de terminal Linux. Grep est un programme extrêmement puissant qui permet à l'utilisateur de sélectionner et de trier les entrées selon des règles complexes, ce qui en fait un élément très populaire dans de nombreuses chaînes de commandes.

La commande grep est principalement utilisée pour rechercher dans un texte ou un fichier des lignes contenant une correspondance avec les mots/chaînes spécifiés. Par défaut, grep affiche les lignes correspondantes, et il peut être utilisé pour rechercher des lignes de texte qui correspondent à une ou plusieurs expressions régulières, et il affiche uniquement les lignes correspondantes.

Conditions préalables

La commande grep fait partie des utilitaires de base de toute distribution Linux, elle est donc préinstallée par défaut sur n'importe quelle distribution Linux, comme AlmaLinux, CentOS, Debian, Linux Mint, Ubuntu, RHEL et RockyLinux.

La syntaxe de base de la commande grep

La syntaxe de base de la commande grep est la suivante :

grep 'word' 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

Comment utiliser la commande grep pour rechercher dans un fichier

Dans le premier exemple, je rechercherai l'utilisateur "tom" dans le fichier passwd Linux. Pour rechercher dans le fichier /etc/passwd l'utilisateur "tom", vous devez saisir la commande suivante :

grep tom /etc/passwd

Vous trouverez ci-dessous un exemple de sortie :

tom:x:1000:1000:tom,,,:/home/tom:/bin/bash

Vous avez la possibilité de demander à grep d'ignorer la casse des mots, c'est-à-dire de faire correspondre abc, Abc, ABC et toutes les combinaisons possibles avec l'option -i comme indiqué ci-dessous :

grep -i "tom" /etc/passwd

Utilisation récursive de grep

Si vous avez un tas de fichiers texte dans une hiérarchie de répertoires, par exemple les fichiers de configuration Apache dans /etc/apache2/ et que vous souhaitez trouver le fichier dans lequel un texte spécifique est défini, utilisez l'option -r de la commande grep pour faire une recherche récursive. Cela effectuera une opération de recherche récursive dans les fichiers pour la chaîne "197.167.2.9" (comme indiqué ci-dessous) dans le répertoire /etc/apache2/ et tous ses sous-répertoires :

grep -r "mydomain.com" /etc/apache2/

Alternativement, la commande suivante peut être utilisée :

grep -R "mydomain.com" /etc/apache2/

Vous trouverez ci-dessous les exemples de résultats pour une recherche similaire sur un serveur Nginx :

grep -r "mydomain.com" /etc/nginx/
/etc/nginx/sites-available/mydomain.com.vhost:        if ($http_host != "www.mydomain.com") {

Ici, vous verrez le résultat pour mydomain.com sur une ligne distincte précédée du nom du fichier (par exemple /etc/nginx/sites-available/mydomain.com.vhost) dans lequel il a été trouvé. L'inclusion des noms de fichiers dans les données de sortie peut être facilement supprimée en utilisant l'option -h (comme expliqué ci-dessous) : grep -h -R "mydomain.com" /etc/nginx/. Vous trouverez ci-dessous un exemple de résultat :

grep -r "mydomain.com" /etc/nginx/
if ($http_host != "www.mydomain.com") {

Utiliser grep pour rechercher uniquement des mots

Lorsque vous recherchez abc, grep correspondra à toutes sortes de choses, à savoir kbcabc, abc123, aarfbc35 et bien d'autres combinaisons sans obéir aux limites des mots. Vous pouvez obliger la commande grep à sélectionner uniquement les lignes contenant des correspondances pour former des mots entiers (ceux qui correspondent uniquement au mot abc), comme indiqué ci-dessous :

grep -w "abc" file.txt

Exemple :

Utiliser grep pour rechercher deux mots différents

Pour rechercher deux mots différents, vous devez utiliser la commande egrep comme indiqué ci-dessous :

egrep -w 'word1|word2' /path/to/file

Compter les lignes pour les mots correspondants

La commande grep a la capacité de signaler le nombre de fois qu'un modèle particulier a été mis en correspondance pour chaque fichier à l'aide de l'option -c (count) (comme indiqué ci-dessous) :

grep -c 'word' /path/to/file

De plus, les utilisateurs peuvent utiliser l'option « -n » précédant chaque ligne de sortie avec le numéro de la ligne du fichier texte à partir duquel elle a été obtenue (comme indiqué ci-dessous) :

grep -n 'root' /etc/passwd

Vous trouverez ci-dessous les exemples de sorties :

1:root:x:0:0:root:/root:/bin/bash

Correspondance inversée Grep

Les utilisateurs peuvent utiliser l'option -v pour imprimer la correspondance, ce qui signifie qu'elle correspondra uniquement aux lignes qui ne contiennent pas le mot donné. Par exemple, imprimez toutes les lignes qui ne contiennent pas le mot par en utilisant la commande suivante :

grep -v par /path/to/file

Comment lister uniquement les noms des fichiers correspondants

Vous devez utiliser l'option -l pour lister les noms de fichiers dont le contenu mentionne un mot particulier, par exemple le mot « primaire », à l'aide de la commande suivante :

grep -l 'primary' *.c

Enfin, vous avez la possibilité d'obliger grep à afficher la sortie dans des couleurs spécifiques en utilisant la commande suivante :

grep --color root /etc/passwd

Vous trouverez ci-dessous des exemples de résultats :

Comment faire en sorte que la commande grep gère plusieurs modèles de recherche

Il peut arriver que vous souhaitiez rechercher plusieurs modèles dans un fichier (ou un ensemble de fichiers) donné. Dans de tels scénarios, vous devez utiliser l'option de ligne de commande '-e' fournie par grep.

Par exemple, supposons que vous souhaitiez rechercher les mots « comment », « faire » et « forger » dans tous les fichiers texte présents dans votre répertoire de travail actuel, voici comment procéder :

grep -e how -e to -e forge *.txt

Voici la commande en action :

L'option de ligne de commande '-e' est également utile dans les scénarios dans lesquels le modèle commence par un trait d'union (-). Par exemple, si vous souhaitez rechercher, par exemple, "-how", la commande suivante ne sera pas utile :

grep -how *.txt

C'est lorsque vous utilisez l'option de ligne de commande -e que la commande comprend exactement ce que vous essayez de rechercher dans ce cas :

grep -e -how *.txt

Voici les deux commandes en action :

Comment limiter la sortie de grep à un nombre particulier de lignes

Si vous souhaitez limiter la sortie de grep à un nombre particulier de lignes, vous pouvez le faire en utilisant l'option de ligne de commande '-m'. Par exemple, supposons que vous souhaitiez rechercher le mot « comment » dans testfile1.txt qui contient les lignes suivantes :

Mais l'exigence est que grep arrête la recherche après que 3 lignes contenant le modèle recherché aient été trouvées. Donc, pour ce faire, vous pouvez exécuter la commande suivante :

grep "how" -m3 testfile1.txt

Voici la commande en action :

Passons à autre chose, voici ce que dit la page de manuel de la commande :

If the input is standard input from a regular file, and NUM matching lines are output, grep ensuresthat the standard input is positioned to just after the last matching line before exiting, regardless of the presence of trailing context lines. This enables a calling process to resume a search.

Ainsi, par exemple, si vous disposez d'un script bash comportant une boucle et que vous souhaitez récupérer une correspondance par itération de boucle, l'utilisation de 'grep -m1' fera le nécessaire.

Comment faire en sorte que grep obtienne des modèles à partir d'un fichier

Si vous le souhaitez, vous pouvez également demander à la commande grep d'obtenir des modèles à partir d'un fichier. L'option de ligne de commande -f de l'outil vous permet de le faire.

Par exemple, supposons que vous souhaitiez rechercher dans tous les fichiers .txt du répertoire actuel les mots « comment » et « à », mais que vous souhaitiez fournir ces chaînes d'entrée via un fichier nommé, par exemple, « entrée », alors voici comment vous pouvez fais ceci:

grep -f input *.txt

Voici la commande en action :

Comment faire en sorte que grep affiche uniquement les lignes qui correspondent complètement au modèle de recherche

Jusqu'à présent, nous avons vu que par défaut, grep correspond et affiche les lignes complètes contenant des modèles de recherche. Mais si l'exigence est de faire en sorte que grep n'affiche que les lignes qui correspondent complètement au modèle recherché, cela peut être fait en utilisant l'option de ligne de commande '-x'.

Par exemple, supposons que le fichier testfile1.txt contienne les lignes suivantes :

Et le modèle que vous souhaitez rechercher est « comment vas-tu ? ». Donc, pour vous assurer que grep n'affiche que les lignes qui correspondent parfaitement à ce modèle, utilisez-le de la manière suivante :

grep -x "how are you?" *.txt

Voici la commande en action :

Comment forcer grep à ne rien afficher dans la sortie

Il peut y avoir des situations dans lesquelles vous n'avez pas besoin de la commande grep pour produire quoi que ce soit dans la sortie. Au lieu de cela, vous voulez simplement savoir si une correspondance a été trouvée ou non en fonction de l'état de sortie de la commande. Ceci peut être réalisé en utilisant l'option de ligne de commande -q.

Tandis que l'option -q coupe la sortie, l'état de sortie de l'outil peut être confirmé par le message « echo $? commande. Dans le cas de grep, la commande se termine avec le statut « 0 » lorsqu'elle réussit (c'est-à-dire qu'une correspondance a été trouvée), tandis qu'elle se termine avec le statut « 1 » lorsqu'aucune correspondance n'a été trouvée.

La capture d'écran suivante montre les scénarios réussis et infructueux :

Comment faire en sorte que grep affiche le nom des fichiers qui ne contiennent pas de modèle de recherche

Par défaut, la commande grep affiche le nom des fichiers contenant le modèle de recherche (ainsi que les lignes correspondantes). C'est tout à fait logique, puisque c'est ce qu'on attend de cet outil. Cependant, il peut y avoir des cas où il peut être nécessaire d'obtenir les noms des fichiers qui ne contiennent pas le modèle recherché.

Ceci est également possible avec grep - les options -L vous permettent de le faire. Ainsi, par exemple, pour rechercher tous les fichiers texte du répertoire courant qui ne contiennent pas le mot « comment », vous pouvez exécuter la commande suivante :

grep -L "how" *.txt

Voici la commande en action :

Comment supprimer les messages d'erreur produits par grep

Si vous le souhaitez, vous pouvez également forcer grep à désactiver tous les messages d'erreur affichés dans la sortie. Cela peut être fait en utilisant l'option de ligne de commande -s. Par exemple, considérons le scénario suivant dans lequel grep génère une erreur/un avertissement lié au répertoire qu'il rencontre :

Donc, dans ce genre de scénario, l’option de ligne de commande -s est utile. Voir ci-dessous.

Vous pouvez donc voir que l'erreur/l'avertissement a été désactivé.

Comment faire en sorte que grep recherche récursivement des répertoires

Comme le montre clairement l'exemple utilisé au point précédent, la commande grep n'effectue pas de recherche récursive par défaut. Pour vous assurer que votre recherche grep est récursive, utilisez l'option de ligne de commande -d et transmettez-lui la valeur « recurse ».

grep -d recurse "how" *

Remarque 1 : Le message d'erreur/avertissement lié au répertoire dont nous avons parlé au point précédent peut également être désactivé à l'aide de l'option -d - tout ce que vous avez à faire est de lui transmettre la valeur « skip » .

Remarque 2 : utilisez l'option « --exclude-dir=[DIR] » pour exclure les répertoires correspondant au modèle DIR des recherches récursives.

Comment faire en sorte que grep termine les noms de fichiers avec le caractère NULL

Comme nous l'avons déjà évoqué, l'option de ligne de commande -l de grep est utilisée lorsque vous souhaitez uniquement que l'outil affiche les noms de fichiers dans la sortie. Par exemple:

Maintenant, ce que vous devez savoir ici, c'est que chaque nom dans la sortie ci-dessus est séparé/terminé par un caractère de nouvelle ligne. Voici comment vous pouvez le vérifier :

Redirigez la sortie vers un fichier, puis imprimez le contenu du fichier :

Ainsi, la sortie de la commande cat confirme la présence d'un caractère de nouvelle ligne entre les noms de fichiers.

Mais comme vous le savez peut-être déjà, le caractère de nouvelle ligne peut également faire partie d'un nom de fichier. Ainsi, lorsqu'il s'agit de cas où les noms de fichiers contiennent une nouvelle ligne et sont également séparés/terminés par une nouvelle ligne, il devient difficile de travailler sur la sortie grep (en particulier lors de l'accès à la sortie via un script).

Ce serait bien si le caractère de séparation/terminaison n'est pas une nouvelle ligne. Eh bien, vous serez heureux de savoir que grep fournit une option de ligne de commande -Z qui garantit que les noms de fichiers sont suivis d'un caractère NULL et non d'une nouvelle ligne.

Ainsi, dans notre cas, la commande devient :

grep -lZ "how" *.txt

Voici comment nous avons confirmé la présence du caractère NULL :

Voici une option de ligne de commande connexe que vous devez connaître :

 -z, --null-data
Treat the input as a set of lines, each terminated by a zero byte (the ASCII NUL character) insteadof a newline. Like the -Z or --null option, this option can be used with commands like sort -z to process arbitrary file names.

Comment utiliser GREP pour rechercher des erreurs dans les fichiers journaux

Grep est le couteau suisse de l'administrateur Linux lorsqu'il s'agit de déboguer les erreurs dans les services. La plupart des services Linux disposent de fichiers journaux dans lesquels ils signalent les erreurs. Ces fichiers journaux peuvent être volumineux et grep est une commande polyvalente et rapide pour rechercher, par exemple. une adresse IP d'un système connecté, une chaîne d'erreur ou l'adresse e-mail d'un utilisateur de messagerie concerné dans le mail.log.

Exemples:

Recherchez les connexions liées à une adresse email spécifique, ici '[email ' dans le fichier mail.log d'un serveur.

grep [email  /var/log/mail.log

Résultat :

Nov 17 09:33:22 mail dovecot: pop3-login: Login: user=<[email >, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17596, TLS, session=<3uoa5ffQovld3Uep>
Nov 17 09:33:23 mail dovecot: pop3([email )<17596><3uoa5ffQovld3Uep>: Disconnected: Logged out top=0/0, retr=1/6647, del=1/1, size=6630
Nov 17 09:34:14 mail dovecot: pop3-login: Login: user=<[email >, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17673, TLS, session=<fIIx6PfQkuBd3Uep>
Nov 17 09:34:14 mail dovecot: pop3([email )<17673><fIIx6PfQkuBd3Uep>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Nov 17 09:35:40 mail dovecot: pop3-login: Login: user=<[email >, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17868, TLS, session=<bd5L7ffQPsld3Uep>
Nov 17 09:35:40 mail dovecot: pop3([email )<17868><bd5L7ffQPsld3Uep>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Nov 17 09:35:58 mail dovecot: pop3-login: Login: user=<[email >, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17964, TLS, session=<sbpn7vfQevpd3Uep>
Nov 17 09:35:58 mail dovecot: pop3([email )<17964><sbpn7vfQevpd3Uep>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Nov 17 09:36:16 mail postfix/smtpd[6932]: NOQUEUE: reject: RCPT from unknown[1.2.3.4]: 504 5.5.2 <1.2.3.4>: Helo command rejected: need fully-qualified hostname; from=<[email > to=<[email > proto=ESMTP helo=<1.2.3.4>

Pour surveiller en permanence un fichier journal pour les connexions pour cette adresse e-mail, combinez les commandes tail et grep comme ceci :

tail -f /var/log/mail.log | grep [email 

Pour quitter la fonction montre, appuyez sur les touches [strg] + c.

Plus d'exemples de commandes GREP

Dans notre deuxième didacticiel sur la commande GREP, vous trouverez encore plus d'exemples sur la façon d'utiliser cette commande Linux.

  • Comment effectuer une recherche de modèles dans des fichiers à l'aide de Grep

Articles connexes: