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
$ 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.