GNU/Linux >> Tutoriels Linux >  >> Linux

Rechercher du texte dans des fichiers sous Linux à l'aide de grep

Ce didacticiel se concentre sur la recherche de texte dans des fichiers à l'aide de la commande grep et d'expressions régulières.

Lorsque vous travaillez sur un système Linux, trouver du texte dans des fichiers est une tâche très courante effectuée quotidiennement par les administrateurs système.

Vous voudrez peut-être rechercher des lignes spécifiques dans un fichier journal afin de résoudre les problèmes de serveurs.

Dans certains cas, vous souhaitez rechercher des actions effectuées par des utilisateurs spécifiques ou vous souhaitez limiter les lignes d'un gros fichier à quelques lignes.

Heureusement pour vous, il existe plusieurs façons de trouver du texte dans des fichiers sous Linux mais la commande la plus populaire est la commande grep.

Développé par Ken Thompson aux débuts d'Unix, grep (g rechercher globalement un r e régulier xpression et p imprimer ) est utilisé depuis plus de 45 ans par les administrateurs système du monde entier.

Dans ce tutoriel, nous allons nous concentrer sur la commande grep et comment cela peut nous aider à trouver efficacement du texte dans des fichiers partout dans notre système.

Prêt ?

Syntaxe Grep sous Linux

Comme spécifié ci-dessus, afin de trouver du texte dans des fichiers sous Linux , vous devez utiliser la commande grep avec la syntaxe suivante

$ grep <option> <expression> <path>

Notez que les options et le chemin sont facultatifs.

Avant de lister et de détailler toutes les options fournies par grep, voyons un moyen rapide de mémoriser la syntaxe de la commande grep.

Afin de mémoriser la syntaxe de la commande grep, rappelez-vous simplement que grep peut être écrit sous la forme grEP ce qui signifie que l'expression vient avant le chemin.

C'est un excellent moyen de se souvenir de la syntaxe grep et de la syntaxe de recherche en même temps, mais la syntaxe de recherche est exactement l'opposé :le chemin d'abord et l'expression après.

Exemples grep rapides

Il existe des options complexes qui peuvent être utilisées avec grep, mais commençons par un ensemble d'exemples très rapides.

Répertorier les utilisateurs à l'aide de grep

Sous Linux, comme vous le savez probablement déjà, les comptes d'utilisateurs sont répertoriés dans un fichier spécifique appelé le fichier passwd.

Pour trouver le compte root dans un fichier spécifique, entrez simplement votre texte et le fichier dans lequel vous souhaitez effectuer une recherche.

$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash

Une autre façon très populaire d'utiliser la commande grep consiste à rechercher un processus spécifique sur votre système Linux.

Filtrer les processus à l'aide de grep

Comme expliqué dans l'un de nos précédents tutoriels, vous devez utiliser le "ps ” afin de lister tous les processus en cours d'exécution sur votre système.

Vous pouvez diriger le "ps » avec la commande « grep ” afin de filtrer les processus qui vous intéressent.

$ ps aux | grep <process>

Si vous êtes intéressé par les processus bash par exemple, vous pouvez taper la commande suivante

$ ps aux | grep bash

root      1230  0.0  0.0  23068  1640 tty1     S+   Jan11   0:00 -bash
user      2353  0.0  0.1  23340  5156 pts/0    Ss   03:32   0:00 -bash
user      2473  0.0  0.0  14856  1056 pts/0    S+   03:45   0:00 grep --color=auto bash
user      6685  0.0  0.0  23140  1688 pts/2    Ss+  Nov09   0:00 bash

Remarque  :si vous ne savez pas comment utiliser les canaux sous Linux, voici un guide complet sur la redirection d'entrée et de sortie.

Inspecter les journaux du noyau Linux avec grep

Une autre utilisation intéressante de la commande grep consiste à inspecter l'anneau tampon du noyau Linux .

Ceci est fortement utilisé lors de l'exécution d'opérations de dépannage sur les systèmes Linux, car le noyau écrira dans son anneau de mémoire tampon lors du démarrage ou du démarrage.

Disons par exemple que vous avez introduit un nouveau disque dans votre système et que vous n'êtes pas sûr du nom donné à ce nouveau disque.

Afin de connaître ces informations, vous pouvez utiliser le "dmesg " et dirigez-le vers la commande grep.

$ dmesg | grep -E sd.{1}

Options de la commande Grep

La commande grep est très utile en elle-même, mais elle l'est encore plus lorsqu'elle est utilisée avec des options.

La commande grep a littéralement une tonne d'options différentes.

Les sections suivantes serviront de guide afin d'utiliser correctement ces options et des exemples seront donnés en cours de route.

Rechercher une chaîne spécifique à l'aide de grep

Dans certains cas, vous pouvez souhaiter rechercher une chaîne ou un texte très spécifique dans un fichier.

Afin de limiter la recherche de texte à une chaîne spécifique, vous devez utiliser des guillemets avant et après votre terme de recherche.

$ grep "This is a specific text" .

Pour illustrer cette option, supposons que vous recherchiez un nom d'utilisateur spécifique sur votre système.

Comme de nombreux noms d'utilisateur peuvent commencer par le même préfixe, vous devez rechercher l'utilisateur en utilisant des guillemets.

$ grep "devconnected" /etc/passwd

Rechercher du texte à l'aide d'expressions régulières

L'une des plus grandes fonctionnalités de la commande grep est la possibilité de rechercher du texte à l'aide d'expressions régulières.

Les expressions régulières sont certainement un excellent outil à maîtriser :elles permettent aux utilisateurs de rechercher du texte en fonction de modèles, comme du texte commençant par une lettre spécifique ou du texte pouvant être défini comme une adresse e-mail.

Grep prend en charge deux types d'expressions régulières :de base et étendu expressions régulières.

Expressions régulières de base (BRE)

La principale différence entre les expressions régulières de base et étendues est le fait que vous pouvez utiliser des symboles d'expressions régulières avec BRE (expressions régulières de base) mais ils devront être précédés d'une barre oblique inverse.

Les modèles d'expressions régulières les plus courants sont détaillés ci-dessous avec des exemples :

  • symbole ^ :également appelé caret, ce petit symbole de chapeau est utilisé pour définir le début d'une ligne. Par conséquent, tout texte après le signe insertion sera mis en correspondance avec les lignes commençant par ce texte.

Par exemple, pour trouver tous les lecteurs commençant par "sd" (également appelés disques SCSI), vous pouvez utiliser le symbole caret avec grep.

$ lsblk | grep "^sb"
  • $ symbole :le signe dollar est l'opposé du signe insertion, il est utilisé pour définir la fin de la ligne. Par conséquent, le pattern matching s'arrêtera juste avant le signe dollar. Ceci est particulièrement utile lorsque vous souhaitez cibler un terme spécifique.

Afin de voir tous les utilisateurs ayant bash shell sur votre système, vous pouvez taper la commande suivante

$ cat /etc/passwd | grep "bash$"
  • . (symbole point) :le symbole point est utilisé pour correspondre à un seul caractère dans une expression régulière. Cela peut être particulièrement pratique lorsque les termes de recherche contiennent les mêmes lettres au début et à la fin, mais pas au milieu.

Si, par exemple, vous avez deux utilisateurs sur votre système, l'un nommé "bob" et l'autre nommé "bab", vous pouvez trouver les deux utilisateurs en utilisant le symbole du point.

$ cat /etc/passwd | grep "b.b"
  • [ ] (symbole crochets) :ce symbole est utilisé pour faire correspondre uniquement un sous-ensemble de caractères. Si vous souhaitez uniquement faire correspondre les caractères « a », ou « o » ou « e », vous devez les mettre entre parenthèses.

Revenons à l'exemple "bob", si vous souhaitez limiter votre recherche à "bob" et "bab", vous pouvez taper la commande suivante

$ cat /etc/passwd | grep "b[ao]b"

En utilisant toutes les options fournies auparavant, il est possible d'isoler des mots simples dans un fichier :en combinant le symbole caret avec le symbole dollar.

$ grep "^word$" <file|path>

Heureusement pour vous, vous n'avez pas besoin de saisir ces caractères à chaque fois que vous souhaitez rechercher des entrées d'un seul mot.

Vous pouvez utiliser le "-w ” à la place.

$ grep -w <expression> <file|path>

Expressions régulières étendues (ERE)

Les expressions régulières étendues, comme son nom l'indique, sont des expressions régulières qui utilisent des expressions plus complexes pour faire correspondre les chaînes.

Vous pouvez utiliser des expressions régulières étendues afin de construire une expression qui va correspondre à une adresse e-mail par exemple.

Pour trouver du texte dans des fichiers utilisant des expressions régulières étendues, vous devez utiliser l'option "-E".

$ grep -E <expression> <path>

Une grande utilisation des expressions régulières étendues est la possibilité de rechercher plusieurs termes de recherche par exemple.

Rechercher plusieurs chaînes dans un fichier

Pour rechercher plusieurs chaînes dans un fichier, utilisez le "-E ” et mettez vos différents termes de recherche séparés par des lignes droites (pour opérateurs OR dans les expressions régulières )

$ grep -E "text1|text2|text3" <path>

Revenons à notre exemple grep précédent, vous pouvez trouver le compte root et le compte bob à l'aide d'expressions régulières étendues.

$ grep -E "root|bob" /etc/passwd

Rechercher des adresses IP à l'aide de grep

Dans certains cas, vous souhaiterez peut-être isoler les adresses IP dans un seul fichier :l'utilisation d'expressions régulières étendues est un excellent moyen de trouver facilement des adresses IP.

De nombreux sites Web différents proposent des expressions régulières prêtes à l'emploi :nous allons utiliser celle-ci pour les adresses IP.

"\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"

Comment liriez-vous cette expression régulière ?

Une adresse IP est composée de 4 nombres à 3 chiffres séparés par des points, c'est exactement ce que décrit cette expression régulière.

([0-9]{1,3}\.){3}      = 3 3-digits numbers separated by dots

[0-9]{1,3}             = the last 3-digits number ending the IP address

Voici comment rechercher des adresses IP à l'aide de la commande grep

grep -E "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" <file|path>

Rechercher des adresses URL à l'aide de grep

De même, il est tout à fait possible de rechercher des adresses URL dans un fichier si vous travaillez quotidiennement avec l'administration du site.

Encore une fois, de nombreux sites Web fournissent des expressions régulières pour les URL, mais nous allons utiliser celle-ci.

grep -E '(http|https)://[^/"]+' <file|path>

Rechercher des adresses e-mail à l'aide de grep

Enfin, il est possible de rechercher des adresses e-mail à l'aide d'expressions régulières étendues.

Pour trouver des adresses e-mail, vous allez utiliser l'expression régulière suivante

grep -E "\b[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" <file|path>

Maintenant que vous avez vu comment utiliser les expressions régulières étendues avec grep, voyons comment vous pouvez rechercher de manière récursive du texte dans un fichier à l'aide d'options.

Rechercher du texte de manière récursive avec grep

Pour trouver du texte de manière récursive (c'est-à-dire explorer chaque répertoire et ses enfants) sous Linux, vous devez utiliser "grep" avec l'option "-r" (pour récursif)

$ grep -R <expression> <path>

Par exemple, pour rechercher tous les fichiers contenant le mot "log" dans le répertoire /var/log, vous taperez

$ grep -R "log$" /var/log

En utilisant cette commande, il est très probable que vous verrez de nombreuses entrées avec une autorisation refusée.

Afin d'ignorer ces entrées d'autorisation refusée, redirigez la sortie de votre commande vers /dev/null

$ grep -R "log$" /var/log 2> /dev/null

Afin de trouver du texte de manière récursive, vous pouvez également utiliser l'option "-d" avec l'action "recurse".

$ grep -d recurse "log$" /var/log

La recherche récursive de texte peut être très pratique lorsque vous essayez de trouver des fichiers de configuration spécifiques sur votre système.

Imprimer les numéros de ligne avec grep

Comme vous pouvez le voir dans nos exemples précédents, nous avons pu isoler des lignes correspondant au modèle spécifié.

De plus, si les fichiers contiennent des milliers de lignes, il serait pénible d'identifier le fichier mais pas le numéro de ligne.

Heureusement pour vous, l'option grep a une option pour imprimer les numéros de ligne avec les différentes correspondances.

Pour afficher les numéros de ligne à l'aide de grep, utilisez simplement le "-n ".

$ grep -n <expression> <path>

Pour en revenir à notre exemple de liste d'utilisateurs, si nous voulons savoir sur quelle ligne se trouvent ces entrées, nous taperions

$ grep -n -E "root|bob" /etc/passwd

Rechercher du texte avec grep en utilisant l'option insensible à la casse

Dans certains cas, vous ne pouvez pas être sûr que le texte est écrit en majuscules ou minuscule lettres.

Heureusement pour vous, la commande grep a une option pour rechercher du texte dans les fichiers en utilisant une option insensible à la casse.

Pour rechercher du texte en utilisant l'option insensible à la casse, utilisez simplement le "-i ".

$ grep -i <expression> <path>

Exclure les motifs de grep

Grep est utilisé pour identifier les fichiers contenant un fichier spécifique, mais que faire si vous vouliez faire exactement le contraire ?

Et si vous vouliez trouver des fichiers ne contenant pas une chaîne spécifique sur votre système Linux ?

C'est tout l'intérêt de l'option de recherche inversée de grep.

Pour exclure les fichiers contenant une chaîne spécifique, utilisez "grep" avec l'option "-v".

$ grep -v <expression> <file|path>

Comme petit exemple, disons que vous avez trois fichiers mais que deux d'entre eux contiennent le mot "log".

Afin d'exclure ces fichiers, vous devez effectuer une correspondance inversée avec l'option "-v".

Afficher les noms de fichiers à l'aide de grep

Dans certains cas, vous n'êtes pas intéressé par la recherche de texte à l'intérieur des fichiers, mais uniquement dans leurs noms de fichiers.

Afin d'imprimer uniquement les noms de fichiers, et non le nom de fichier avec la sortie réelle, utilisez l'option "-l".

$ grep -l <expression> <path>

En utilisant notre exemple précédent, nous n'obtiendrions pas le contenu du fichier, mais seulement le nom du fichier.

Conclusion

Dans ce didacticiel, vous avez appris comment vous pouvez facilement rechercher du texte dans des fichiers sous Linux.

Vous avez appris que vous pouvez utiliser de nombreuses options différentes :expressions régulières de base ou plus avancées des expressions régulières (étendues) si vous cherchez à faire correspondre des adresses IP ou des numéros de téléphone par exemple.

Vous avez également découvert que vous pouvez effectuer des recherches inversées afin de trouver des fichiers pas correspondant à un modèle spécifique sur votre système.

Si vous êtes intéressé par l'administration système Linux, nous avons une section complète qui lui est dédiée sur le site Web, alors n'hésitez pas à y jeter un coup d'œil !


Linux
  1. Comment utiliser la commande Grep pour rechercher du texte dans des fichiers

  2. Utilisation de sed pour rechercher et remplacer des fichiers texte sous Linux

  3. Utilisation de la commande Linux find – Utilisation avec des exemples

  4. Commande Linux :Comment "trouver" uniquement des fichiers texte ?

  5. Comment trouver des fichiers texte ne contenant pas de texte sous Linux ?

Utilisation de less pour afficher les fichiers texte sur la ligne de commande Linux

Comment trouver des fichiers sous Linux

Commande Grep sous Linux (Rechercher du texte dans des fichiers)

Trouver des fichiers volumineux sous Linux

Comment trouver des fichiers en utilisant la ligne de commande dans le terminal Linux

Comment protéger par mot de passe des fichiers texte à l'aide de l'éditeur Vim sous Linux