in

Comment utiliser la commande grep sous Linux

Fatmawati Achmad Zaenuri / Shutterstock

Le Linux grep La commande est un utilitaire de correspondance de chaînes et de modèles qui affiche les lignes correspondantes de plusieurs fichiers. Il fonctionne également avec la sortie canalisée d’autres commandes. Nous vous montrons comment.

L’histoire derrière grep

le grep commande est célèbre sous Linux et Unix cercles pour trois raisons. Premièrement, il est extrêmement utile. Deuxièmement, le la multitude d’options peut être écrasante. Troisièmement, il a été rédigé du jour au lendemain pour répondre à un besoin particulier. Les deux premiers sont parfaits; le troisième est légèrement décalé.

Ken Thompson avait extrait les capacités de recherche d’expressions régulières de ed éditeur (prononcé ee-dee) et a créé un petit programme – pour son propre usage – pour rechercher dans les fichiers texte. Son chef de service à Bell Labs, Doug Mcilroy, s’est approché de Thompson et a décrit le problème à l’un de ses collègues, Lee McMahon, faisait face.

McMahon essayait d’identifier les auteurs du Papiers fédéralistes par l’analyse textuelle. Il avait besoin d’un outil capable de rechercher des phrases et des chaînes dans des fichiers texte. Thompson a passé environ une heure ce soir-là à faire de son outil un utilitaire général qui pourrait être utilisé par d’autres et l’a renommé grep. Il a pris le nom du ed chaîne de commande g/re/p , qui se traduit par «recherche d’expressions régulières globales».

Vous pouvez regarder Thompson parler à Brian Kernighan à propos de la naissance de grep.

Recherches simples avec grep

Pour rechercher une chaîne dans un fichier, passez le terme de recherche et le nom du fichier sur la ligne de commande:

grep dave / etc / password dans une fenêtre de terminal

Les lignes correspondantes s’affichent. Dans ce cas, il s’agit d’une seule ligne. Le texte correspondant est mis en surbrillance. En effet, sur la plupart des distributions grep est aliasé sur:

alias grep='grep --colour=auto'

Regardons les résultats où plusieurs lignes correspondent. Nous chercherons le mot «Moyenne» dans un fichier journal d’application. Parce que nous ne pouvons pas nous rappeler si le mot est en minuscules dans le fichier journal, nous utiliserons le -i (ignorer la casse) option:

grep -i Average geek-1.log

grep -i Moyenne geek-1.log dans une fenêtre de terminal

Chaque ligne correspondante est affichée, avec le texte correspondant en surbrillance dans chacune.

Sortie de grep -i Moyenne geek-1.log dans une fenêtre de terminal

Nous pouvons afficher les lignes non concordantes en utilisant l’option -v (invert match).

grep -v Mem geek-1.log

grep -v Mem geek-1.log dans une fenêtre de terminal

Il n’y a pas de mise en évidence car ce sont les lignes qui ne correspondent pas.

sortie de grep -v Mem geek-1.log dans une fenêtre de terminal

Nous pouvons causer grep être complètement silencieux. Le résultat est passé au shell en tant que valeur de retour de grep. Un résultat de zéro signifie la chaîne trouvée, et un résultat de un signifie qu’elle a été trouvée. Nous pouvons vérifier le code de retour en utilisant le $? paramètres spéciaux:

grep -q average geek-1.log
echo $?
grep -q howtogeek geek-1.log
echo $?

grep -q average geek-1.log dans une fenêtre de terminal

Recherches récursives avec grep

Pour rechercher dans les répertoires et sous-répertoires imbriqués, utilisez l’option -r (récursive). Notez que vous ne fournissez pas de nom de fichier sur la ligne de commande, vous devez fournir un chemin. Ici, nous recherchons dans le répertoire actuel « . » et tous les sous-répertoires:

grep -r -i memfree .

grep -r -i memfree.  dans une fenêtre de terminal

La sortie comprend le répertoire et le nom de fichier de chaque ligne correspondante.

sortie de grep -r -i memfree.  dans une fenêtre de terminal

Nous pouvons faire grep suivez les liens symboliques en utilisant le -R (déréférencement récursif). Nous avons un lien symbolique dans ce répertoire, appelé logs-folder. Il pointe vers /home/dave/logs.

ls -l logs-folder

ls -l logs-folder dans une fenêtre de terminal

Répétons notre dernière recherche avec le -R (déréférencement récursif):

grep -R -i memfree .

grep -R -i memfree.  dans une fenêtre de terminal

Le lien symbolique est suivi et le répertoire vers lequel il pointe est recherché par grep aussi.

Sortie de grep -R -i memfree.  dans une fenêtre de terminal

Recherche de mots entiers

Par défaut, grep correspondra à une ligne si la cible de recherche apparaît n’importe où dans cette ligne, y compris à l’intérieur d’une autre chaîne. Regardez cet exemple. Nous allons rechercher le mot «gratuit».

grep -i free geek-1.log

grep -i free geek-1.log dans une fenêtre de terminal

Les résultats sont des lignes contenant la chaîne «free», mais ce ne sont pas des mots séparés. Ils font partie de la chaîne « MemFree ».

Sortie de grep -i free geek-1.log dans une fenêtre de terminal

Forcer grep pour faire correspondre des « mots » séparés uniquement, utilisez le -w (expression rationnelle de mot).

grep -w -i free geek-1.log
echo $?

grep -w -i free geek-1.log dans une fenêtre de terminal

Cette fois, il n’y a pas de résultats car le terme de recherche «gratuit» n’apparaît pas dans le fichier en tant que mot distinct.

Utilisation de plusieurs termes de recherche

le -E (expression régulière étendue) vous permet de rechercher plusieurs mots. (Le -E option remplace la version obsolète egrep version de grep.)

Cette commande recherche deux termes de recherche, «moyenne» et «sans mémoire».

grep -E -w -i "average|memfree" geek-1.log

grep -E -w -i "moyenne | memfree" geek-1.log dans une fenêtre de terminal

Toutes les lignes correspondantes sont affichées pour chacun des termes de recherche.

Sortie de grep -E -w -i "moyenne | memfree" geek-1.log dans une fenêtre de terminal

Vous pouvez également rechercher plusieurs termes qui ne sont pas nécessairement des mots entiers, mais qui peuvent également être des mots entiers.

le -e L’option (modèles) vous permet d’utiliser plusieurs termes de recherche sur la ligne de commande. Nous utilisons la fonction de crochet d’expression régulière pour créer un modèle de recherche. Il raconte grep pour correspondre à l’un des caractères contenus entre crochets « []. » Ça signifie grep correspondra à «Ko» ou «Ko» lors de la recherche.

grep -e MemFree -e [kK]B geek-1.log dans une fenêtre de terminal

Les deux chaînes sont mises en correspondance et, en fait, certaines lignes contiennent les deux chaînes.

Sortie de grep -e MemFree -e [kK]B geek-1.log dans une fenêtre de terminal

Correspondance exacte des lignes

le -x (line regexp) ne correspondra qu’aux lignes où le correspond au terme de recherche. Cherchons une date et un horodatage dont nous savons qu’ils n’apparaissent qu’une seule fois dans le fichier journal:

grep -x "20-Jan--06 15:24:35" geek-1.log

grep -x "20 janvier - 06 15:24:35" geek-1.log dans une fenêtre de terminal

La seule ligne qui correspond est trouvée et affichée.

Le contraire ne montre que les lignes qui correspondent. Cela peut être utile lorsque vous consultez des fichiers de configuration. Les commentaires sont excellents, mais il est parfois difficile de repérer les paramètres réels parmi tous. Voici le /etc/sudoers fichier:

Contenu du fichier / etc / sudoers dans une fenêtre de terminal

Nous pouvons filtrer efficacement les lignes de commentaires comme ceci:

sudo grep -v "https://www.howtogeek.com/496056/how-to-use-the-grep-command-on-linux/#" /etc/sudoers

sudo grep -v "#" / etc / sudoers dans une fenêtre de terminal

C’est beaucoup plus facile à analyser.

Afficher uniquement le texte correspondant

Il peut arriver que vous ne souhaitiez pas voir toute la ligne correspondante, juste le texte correspondant. le -o (seulement correspondant) option fait exactement cela.

grep -o MemFree geek-1.log

grep -o MemFree geek-1.log dans une fenêtre de terminal

L’affichage est réduit à n’afficher que le texte qui correspond au terme de recherche, au lieu de toute la ligne correspondante.

sortie de grep -o MemFree geek-1.log dans une fenêtre de terminal

Compter avec grep

grep ne se limite pas au texte, il peut également fournir des informations numériques. Nous pouvons faire grep comptent pour nous de différentes manières. Si nous voulons savoir combien de fois un terme de recherche apparaît dans un fichier, nous pouvons utiliser le -c (compter) option.

grep -c average geek-1.log

grep -c average geek-1.log dans une fenêtre de terminal

grep signale que le terme de recherche apparaît 240 fois dans ce fichier.

Tu peux faire grep afficher le numéro de ligne pour chaque ligne correspondante en utilisant le -n (numéro de ligne) option.

grep -n Jan geek-1.log

grep -n jan geek-1.log dans une fenêtre de terminal

Le numéro de ligne de chaque ligne correspondante est affiché au début de la ligne.

Sortie de grep -n jan geek-1.log dans une fenêtre de terminal

Pour réduire le nombre de résultats affichés, utilisez le -m (nombre maximum) option. Nous allons limiter la sortie à cinq lignes correspondantes:

grep -m5 -n Jan geek-1.log

grep -m5 -n Jan geek-1.log dans une fenêtre de terminal

Ajout de contexte

Il est souvent utile de pouvoir voir des lignes supplémentaires – éventuellement des lignes non correspondantes – pour chaque ligne correspondante. il peut vous aider à distinguer les lignes correspondantes qui vous intéressent.

Pour afficher quelques lignes après la ligne correspondante, utilisez l’option -A (après le contexte). Nous demandons trois lignes dans cet exemple:

grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log

grep -A 3 -x "20-janv.-06 15:24:35" geek-1.log dans une fenêtre de terminal

Pour voir quelques lignes avant la ligne correspondante, utilisez le -B (contexte avant) option.

grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log

grep -B 3 -x "20-janv.-06 15:24:35" geek-1.log dans une fenêtre de terminal

Et pour inclure des lignes avant et après la ligne correspondante, utilisez le -C (contexte) option.

grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log

grep -C 3 -x "20-janv.-06 15:24:35" geek-1.log dans une fenêtre de terminal

Affichage des fichiers correspondants

Pour voir les noms des fichiers contenant le terme de recherche, utilisez le -l (fichiers avec correspondance) option. Pour savoir quels fichiers de code source C contiennent des références au sl.h fichier d’en-tête, utilisez cette commande:

grep -l "sl.h" *.c

grep -l "sl.h" * .c dans une fenêtre de terminal

Les noms de fichiers sont répertoriés, pas les lignes correspondantes.

Sortie de grep -l "sl.h" * .c dans une fenêtre de terminal

Et bien sûr, nous pouvons rechercher des fichiers qui ne contiennent pas le terme de recherche. le -L (fichiers sans correspondance) fait exactement cela.

grep -L "sl.h" *.c

grep -L "sl.h" * .c dans une fenêtre de terminal

Début et fin des lignes

Nous pouvons forcer grep pour n’afficher que les correspondances qui se trouvent au début ou à la fin d’une ligne. L’opérateur d’expression régulière «^» correspond au début d’une ligne. Pratiquement toutes les lignes du fichier journal contiendront des espaces, mais nous allons rechercher les lignes qui ont un espace comme premier caractère:

grep "^ " geek-1.log

grep "^ " geek-1.log dans une fenêtre de terminal

Les lignes qui ont un espace comme premier caractère – au début de la ligne – sont affichées.

Sortie grep "^ " geek-1.log dans une fenêtre de terminal

Pour faire correspondre la fin de la ligne, utilisez l’opérateur d’expression régulière «$». Nous allons rechercher les lignes qui se terminent par «00».

grep "00$" geek-1.log

grep "00 $" geek-1.log dans une fenêtre de terminal

L’écran affiche les lignes qui ont «00» comme caractères finaux.

sortie de grep "00 $" geek-1.log dans une fenêtre de terminal

Utilisation de tuyaux avec grep

Bien sûr, vous pouvez diriger l’entrée vers grep , dirigez la sortie de grep dans un autre programme, et grep niché au milieu d’une chaîne de tuyaux.

Disons que nous voulons voir toutes les occurrences de la chaîne «ExtractParameters» dans nos fichiers de code source C. Nous savons qu’il y en aura pas mal, donc nous canalisons la sortie dans less:

grep "ExtractParameters" *.c | less

grep "ExtraitParamètres" * .c |  moins dans une fenêtre de terminal

La sortie est présentée dans less.

Sortie de grep "ExtraitParamètres" * .c |  moins dans une fenêtre de terminal

Cela vous permet de parcourir la liste des fichiers et d’utiliser less's fonction de recherche.

Si nous canalisons la sortie de grep dans wc et utilisez le -l (lignes) option, nous peut compter le nombre de lignes dans les fichiers de code source contenant «ExtractParameters». (Nous pourrions y parvenir en utilisant le grep -c (count), mais c’est une manière intéressante de montrer la tuyauterie hors grep.)

grep "ExtractParameters" *.c | wc -l

grep "ExtraitParamètres" * .c |  wc -l dans une fenêtre de terminal

Avec la commande suivante, nous acheminons la sortie de ls dans grep et canalisant la sortie de grep dans sort . Nous listons les fichiers dans le répertoire actuel, en sélectionnant ceux contenant la chaîne « Aug », et les trier par taille de fichier:

ls -l | grep "Aug" | sort +4n

ls -l |  grep "Août" |  tri + 4n dans une fenêtre de terminal

Décomposons cela:

  • ls -l: Effectuez une longue liste de format des fichiers en utilisant ls.
  • grep « août »: Sélectionnez les lignes dans ls liste contenant «août». Notez que cela trouverait également les fichiers dont le nom contient «Aug».
  • trier + 4n: Triez la sortie de grep sur la quatrième colonne (taille du fichier).

Nous obtenons une liste triée de tous les fichiers modifiés en août (quelle que soit l’année), par ordre croissant de taille de fichier.

grep: moins une commande, plus un allié

grep est un outil formidable à avoir à votre disposition. Il date de 1974 et continue de fonctionner car nous avons besoin de ce qu’il fait, et rien ne le fait mieux.

Couplage grep avec quelques expressions régulières-fu l’amène vraiment au niveau suivant.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Comment trier les valeurs dans Microsoft Excel

Qu'est-ce que la «confidentialité différentielle» et comment garde-t-elle mes données anonymes?

Qu’est-ce que la «confidentialité différentielle» et comment garde-t-elle mes données anonymes?