GNU/Linux >> Tutoriels Linux >  >> Linux

Commande Grep sous Linux (avec exemples)

Dans ce tutoriel, vous apprendrez à utiliser le très essentiel grep commande sous Linux. Nous allons expliquer pourquoi cette commande est importante à maîtriser et comment vous pouvez l'utiliser dans vos tâches quotidiennes en ligne de commande.

Plongeons-nous directement dans quelques explications et exemples.

Pourquoi utilisons-nous grep ?

Grep est un outil de ligne de commande que les utilisateurs de Linux utilisent pour rechercher des chaînes de texte. Vous pouvez l'utiliser pour rechercher dans un fichier un certain mot ou une combinaison de mots, ou vous pouvez rediriger la sortie d'autres commandes Linux vers grep, afin que grep puisse vous montrer uniquement la sortie que vous devez voir.

Regardons quelques exemples vraiment courants. Supposons que vous deviez vérifier le contenu d'un répertoire pour voir si un certain fichier y existe. C'est quelque chose pour lequel vous utiliseriez la commande "ls".

Mais, pour rendre tout ce processus de vérification du contenu du répertoire encore plus rapide, vous pouvez diriger la sortie de la commande ls vers la commande grep. Cherchons dans notre répertoire personnel un dossier appelé Documents.

Et maintenant, essayons de vérifier à nouveau le répertoire, mais cette fois en utilisant grep pour vérifier spécifiquement le dossier Documents.

$ ls | grep Documents

Comme vous pouvez le voir dans la capture d'écran ci-dessus, l'utilisation de la commande grep nous a fait gagner du temps en isolant rapidement le mot que nous recherchions du reste de la sortie inutile produite par la commande ls.

Si le dossier Documents n'existait pas, grep ne renverrait aucune sortie. Donc, si grep ne renvoie rien, cela signifie qu'il n'a pas pu trouver le mot que vous recherchez.

Rechercher une chaîne

Si vous devez rechercher une chaîne de texte, plutôt qu'un seul mot, vous devrez placer la chaîne entre guillemets. Par exemple, que se passe-t-il si nous devions rechercher le répertoire « Mes documents » au lieu du répertoire « Documents » composé d'un seul mot ?

$ ls | grep 'My Documents'

Grep accepte à la fois les guillemets simples et les guillemets doubles, alors enveloppez votre chaîne de texte avec l'un ou l'autre.

Bien que vous puissiez utiliser grep pour rechercher la sortie canalisée à partir d'autres outils de ligne de commande, vous pouvez également l'utiliser pour rechercher directement des documents. Voici un exemple où nous recherchons une chaîne dans un document texte.

$ grep 'Class 1' Students.txt

Rechercher plusieurs chaînes

Vous pouvez également utiliser grep pour rechercher plusieurs mots ou chaînes. Vous pouvez spécifier plusieurs modèles à l'aide du commutateur -e. Essayons de rechercher dans un document texte deux chaînes différentes :

$ grep -e 'Class 1' -e Todd Students.txt

Notez que nous n'avions besoin que d'utiliser des guillemets autour des chaînes contenant des espaces.

Différence entre grep, egrep fgrep, pgrep, zgrep

Divers commutateurs grep étaient historiquement inclus dans différents binaires. Sur les systèmes Linux modernes, vous trouverez ces commutateurs disponibles dans la commande base grep, mais il est courant de voir les distributions prendre également en charge les autres commandes.

À partir de la page de manuel de grep :

egrep est l'équivalent de grep -E

Ce commutateur interprétera un modèle comme une expression régulière étendue. Il y a une tonne de choses différentes que vous pouvez faire avec cela, mais voici un exemple de ce à quoi cela ressemble d'utiliser une expression régulière avec grep.

Recherchons dans un document texte les chaînes contenant deux lettres "p" consécutives :

$ egrep p\{2} fruits.txt

ou

$ grep -E p\{2} fruits.txt

fgrep est l'équivalent de grep -F

Ce commutateur interprétera un modèle comme une liste de chaînes fixes et essaiera de faire correspondre l'une d'entre elles. C'est utile lorsque vous devez rechercher des caractères d'expression régulière. Cela signifie que vous n'avez pas à échapper les caractères spéciaux comme vous le feriez avec un grep normal.

pgrep est une commande permettant de rechercher le nom d'un processus en cours d'exécution sur votre système et de renvoyer ses ID de processus respectifs. Par exemple, vous pouvez l'utiliser pour trouver l'ID de processus du démon SSH :

$ pgrep sshd

Cette fonction est similaire à la simple canalisation de la sortie de la commande "ps" vers grep.

Vous pouvez utiliser ces informations pour arrêter un processus en cours d'exécution ou résoudre des problèmes avec les services en cours d'exécution sur votre système.

Vous pouvez utiliser zgrep pour rechercher un modèle dans des fichiers compressés. Il vous permet de rechercher les fichiers à l'intérieur d'une archive compressée sans avoir à décompresser d'abord cette archive, ce qui vous permet d'économiser une ou deux étapes supplémentaires.

$ zgrep apple fruits.txt.gz

zgrep fonctionne également sur les fichiers tar, mais ne semble aller que jusqu'à vous dire s'il a pu ou non trouver une correspondance.

Nous le mentionnons car les fichiers compressés avec gzip sont très souvent des archives tar.

Différence entre trouver et grep

Pour ceux qui débutent sur la ligne de commande Linux, il est important de se rappeler que find et grep sont deux commandes avec deux fonctions très différentes, même si nous utilisons les deux pour "trouver" quelque chose que l'utilisateur spécifie.

Il est pratique d'utiliser grep pour trouver un fichier lorsque vous l'utilisez pour rechercher dans la sortie de la commande ls comme nous l'avons montré dans les premiers exemples du didacticiel.

Cependant, si vous devez rechercher de manière récursive le nom d'un fichier - ou une partie du nom de fichier si vous utilisez un caractère générique (astérisque) - vous êtes bien en avance pour utiliser la commande "trouver".

$ find /path/to/search -name name-of-file

La sortie ci-dessus montre que la commande find a réussi à localiser le fichier que nous avons recherché.

Recherche récursive

Vous pouvez utiliser le commutateur -r avec grep pour effectuer une recherche récursive dans tous les fichiers d'un répertoire et de ses sous-répertoires pour un modèle spécifié.

$ grep -r pattern /directory/to/search

Si vous ne spécifiez pas de répertoire, grep recherchera simplement votre répertoire de travail actuel. Dans la capture d'écran ci-dessous, grep a trouvé deux fichiers correspondant à notre modèle et revient avec leurs noms de fichiers et le répertoire dans lequel ils résident.

Attraper l'espace ou l'onglet

Comme nous l'avons mentionné précédemment dans notre explication sur la recherche d'une chaîne, vous pouvez placer du texte entre guillemets s'il contient des espaces. La même méthode fonctionnera pour les onglets, mais nous expliquerons comment mettre un onglet dans votre commande grep dans un instant.

Mettez un ou plusieurs espaces entre guillemets pour que grep recherche ce caractère.

$ grep " " sample.txt

Il existe différentes manières de rechercher un onglet avec grep, mais la plupart des méthodes sont expérimentales ou peuvent être incohérentes d'une distribution à l'autre.

Le moyen le plus simple consiste simplement à rechercher le caractère de tabulation lui-même, que vous pouvez produire en appuyant sur ctrl + v sur votre clavier, suivi de tabulation.

Normalement, appuyer sur tab dans une fenêtre de terminal indique au terminal que vous souhaitez compléter automatiquement une commande, mais appuyer sur la combinaison ctrl + v au préalable entraînera l'écriture du caractère de tabulation comme vous vous y attendriez normalement dans un éditeur de texte .

$ grep "    " sample.txt

Connaître cette petite astuce est particulièrement utile lorsque vous parcourez les fichiers de configuration sous Linux, car les onglets sont fréquemment utilisés pour séparer les commandes de leurs valeurs.

Utiliser des expressions régulières

La fonctionnalité de Grep est encore étendue en utilisant des expressions régulières, ce qui vous permet plus de flexibilité dans vos recherches. Il en existe plusieurs, et nous passerons en revue quelques-uns des plus courants dans les exemples ci-dessous :

[ ] crochets sont utilisés pour correspondre à n'importe quel ensemble de caractères.

$ grep "Class [123]" Students.txt

Cette commande renverra toutes les lignes indiquant "Classe 1", "Class2" ou "Classe 3".

[-] crochets avec un trait d'union peut être utilisé pour spécifier une plage de caractères, numériques ou alphabétiques.

$ grep "Class [1-3]" Students.txt

Nous obtenons le même résultat qu'auparavant, mais la commande est beaucoup plus facile à taper, surtout si nous avions une plus grande plage de chiffres ou de lettres.

^ caret est utilisé pour rechercher un motif qui n'apparaît qu'au début d'une ligne.

$ grep "^Class" Students.txt

[^] crochets avec caret sont utilisés pour exclure des caractères d'un modèle de recherche.

$ grep "Class [^1-2]" Students.txt

Signe dollar $ est utilisé pour rechercher un motif qui n'apparaît qu'à la fin d'une ligne.

$ grep "1$" Students.txt

. point est utilisé pour correspondre à n'importe quel caractère, il s'agit donc d'un caractère générique, mais uniquement pour un seul caractère.

$ grep "A….a" Students.txt

Grep gz fichiers sans décompresser

Comme nous l'avons montré précédemment, vous pouvez utiliser la commande zgrep pour rechercher dans les fichiers compressés sans avoir à les décompresser au préalable.

$ zgrep word-to-search /path/to/file.gz

Vous pouvez également utiliser la commande zcat pour afficher le contenu d'un fichier gz, puis diriger cette sortie vers grep pour isoler les lignes contenant votre chaîne de recherche.

$ zcat file.gz | grep word-to-search

Regrouper les adresses e-mail à partir d'un fichier zip

Nous pouvons utiliser une expression régulière sophistiquée pour extraire toutes les adresses e-mail d'un fichier zip.

$ grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' emails.txt

Le drapeau -o extraira l'adresse e-mail uniquement , au lieu d'afficher toute la ligne contenant l'adresse e-mail. Cela se traduit par une sortie plus propre.

Comme pour la plupart des choses sous Linux, il y a plus d'une façon de le faire. Vous pouvez également utiliser egrep et un ensemble différent d'expressions. Mais l'exemple ci-dessus fonctionne très bien et est un moyen assez simple d'extraire les adresses e-mail et d'ignorer tout le reste.

Adresses IP de groupe

Greping pour les adresses IP peut devenir un peu complexe car nous ne pouvons pas simplement dire à grep de rechercher quatre nombres séparés par des points - eh bien, nous pourrons, mais cette commande peut également renvoyer des adresses IP invalides.

La commande suivante trouvera et isolera uniquement adresses IPv4 valides :

$ 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]?)" /var/log/auth.log

Nous l'avons utilisé sur notre serveur Ubuntu juste pour voir d'où provenaient les dernières tentatives SSH.

Pour éviter la répétition des informations et l'empêcher d'inonder votre écran, vous pouvez diriger vos commandes grep vers "uniq" et "more" comme nous l'avons fait dans la capture d'écran ci-dessus.

Grep ou condition

Il existe plusieurs façons d'utiliser une condition or avec grep, mais nous allons vous montrer celle qui nécessite le moins de frappes et est la plus facile à retenir :

$ grep -E 'string1|string2' filename

ou, techniquement, utiliser egrep nécessite encore moins de frappes :

$ egrep 'string1|string2' filename

Ignorer la sensibilité à la casse

Par défaut, grep est sensible à la casse, ce qui signifie que vous devez être précis dans la casse de votre chaîne de recherche. Vous pouvez éviter cela en disant à grep d'ignorer la casse avec le commutateur -i.

$ grep -i string filename

Recherche sensible à la casse

Que se passe-t-il si nous voulons rechercher une chaîne où la première peut être en majuscule ou en minuscule, mais le reste de la chaîne doit être en minuscule ? Ignorer la casse avec le commutateur -i ne fonctionnera pas dans ce cas, donc un moyen simple de le faire serait d'utiliser des crochets.

$ grep [Ss]tring filename

Cette commande indique à grep d'être sensible à la casse sauf pour la première lettre.

Correspondance exacte de Grep

Dans nos exemples ci-dessus, chaque fois que nous recherchons dans notre document la chaîne "apple", grep renvoie également "pineapple" dans le cadre de la sortie. Pour éviter cela, et rechercher strictement "apple", vous pouvez utiliser cette commande :

$ grep "\<apple\>" fruits.txt

Vous pouvez également utiliser le commutateur -w, qui indiquera à grep que la chaîne doit correspondre à toute la ligne. Évidemment, cela ne fonctionnera que dans les situations où vous ne vous attendez pas à ce que le reste de la ligne contienne du texte.

Exclure le motif

Pour voir le contenu d'un fichier mais exclure les modèles de la sortie, vous pouvez utiliser le commutateur -v.

$ grep -v string-to-exclude filename

Comme vous pouvez le voir sur la capture d'écran, la chaîne que nous avons exclue n'est plus affichée lorsque nous exécutons la même commande avec le commutateur -v.

Grep et remplacer

Une commande grep redirigée vers sed peut être utilisée pour remplacer toutes les instances d'une chaîne dans un fichier. Cette commande remplacera "chaîne1" par "chaîne2" dans tous les fichiers relatifs au répertoire de travail actuel :

$ grep -rl 'string1' ./ | xargs sed -i 's/string1/string2/g'

Grep avec numéro de ligne

Pour afficher le numéro de ligne qui contient votre chaîne, utilisez le commutateur -n :

$ grep -n string filename

Afficher les lignes avant et après

Si vous avez besoin d'un peu plus de contexte pour la sortie de grep, vous pouvez afficher une ligne avant et après votre chaîne de recherche spécifiée avec le commutateur -c :

$ grep -c 1 string filename

Spécifiez le nombre de lignes que vous souhaitez afficher - nous n'avons fait qu'une seule ligne dans cet exemple.

Trier le résultat

Dirigez la sortie de greps vers la commande sort pour trier vos résultats dans un certain ordre. La valeur par défaut est alphabétique.

$ grep string filename | sort

J'espère que vous trouverez le tutoriel utile. Continuez à revenir.


Linux
  1. Commande Linux wc avec exemples

  2. Commande de tri Linux avec exemples

  3. Commande Linux Tee avec exemples

  4. Commande principale Linux avec exemples

  5. Commande JQ sous Linux avec exemples

15 Commande Linux ps avec exemples

Commande de CD Linux avec exemples

Commande Linux watch avec exemples

Commande Wait sous Linux avec des exemples

Commande d'exportation Linux avec exemples

Commande IP Linux avec exemples