Comment utiliser la commande grep sous Linux

Contenu

Une invite de terminal sur un PC Linux.

Sous 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 en pipeline d'autres commandes. Nous vous montrons comment.

L'histoire de grep

Les grep La commande est célèbre sous Linux et Unix cercles pour trois raisons. En premier lieu, c'est super utile. En second lieu, les le grand nombre d'options peut être écrasant. En troisième lieu, a été écrit du jour au lendemain pour répondre à un besoin particulier. Les deux premiers sont très bien; le troisième est légèrement décalé.

Ken Thompson j'avais extrait le expression régulière capacités de recherche ed éditeur (prononcé ee-dee) et créé un petit programme, pour votre propre usage, pour rechercher des fichiers texte. Votre chef de service à Laboratoires Bell, Doug Mcilroy, s'est approché de Thompson et a décrit le problème à l'un de ses collègues, Lee McMahon, j'étais confronté.

McMahon essayait d'identifier les auteurs du Documents fédéralistes par l'analyse textuelle. J'avais besoin d'un outil capable de rechercher des phrases et des chaînes dans des fichiers texte. Thompson a passé environ une heure cette nuit-là à faire de son outil un utilitaire général que d'autres pourraient utiliser et l'a renommé grep. Il a pris le nom de ed chaîne de commandement g/re/p , qui se traduit par “recherche globale d’expressions régulières”.

Vous pouvez voir Thompson parler afin de Brian Kernighan sur la naissance de grep.

Recherches simples avec grep

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

dave grep / etc / mot de passe en una terminal widnow

Les lignes correspondantes sont affichées. Pour ce cas, c'est une seule ligne. Le texte correspondant est mis en surbrillance. C'est parce que dans la plupart des distributions grep a un alias pour:

alias grep = 'grep --color = auto'

Regardons les résultats où il y a plusieurs lignes qui correspondent. Nous allons chercher le mot “Moyenne” dans un fichier journal d’application. Parce que nous ne pouvons pas nous souvenir si le mot est en minuscule dans le fichier journal, nous utiliserons le -i (ignorer les majuscules et les minuscules) option:

grep -i Moyenne geek-1.log

Toutes les lignes correspondantes sont affichées, avec le texte correspondant mis en évidence sur chaque.

Nous pouvons afficher les lignes qui ne correspondent pas en utilisant l'option -v (correspondance inversée).

grep -v Mem geek-1.log

Il n'y a pas de surlignage car ce sont les lignes dépareillées.

Nous pouvons provoquer grep être totalement silencieux. Le résultat est passé au shell en tant que valeur de retour de grep. Un résultat de zéro signifie que la chaîne ère trouvé, et un résultat d'un signifie que je n'étais pas réunions. Nous pouvons vérifier le code de retour en utilisant le $? paramètres spéciaux:

grep -q moyenne geek-1.log
écho $?
grep -q systempeaker geek-1.log
écho $?

Recherches récursives avec grep

Pour rechercher des répertoires et sous-répertoires imbriqués, utiliser l'option -r (récursif). Notez que vous ne fournissez pas de nom de fichier sur la ligne de commande, doit fournir un chemin. Ici, nous regardons dans le répertoire actuel “.” et tous les sous-répertoires:

grep -r -i memfree .

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

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

ls -l dossier-journaux

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

grep -R -i memfree .

Suivez le lien symbolique et recherchez dans le répertoire vers lequel il pointe. grep en outre.

Recherche de mots entiers

Par défaut, grep correspondra à une ligne si la cible de recherche apparaît n'importe où sur cette ligne, même dans une autre chaîne. Regardez cet exemple. Cherchons le mot “gratuite”.

grep -i gratuit geek-1.log

les résultats sont des lignes qui organisent la chaîne “libre” en eux, mais ce ne sont pas des mots séparés. Ils font partie de la chaîne “MemFree”.

Forcer grep pour correspondre uniquement “mots” Séparer, Utilisez le -w (expression rationnelle de mot) option.

grep -w -i gratuit geek-1.log
écho $?

Cette fois, il n’y a pas de résultats car le terme de recherche “gratuite” n’apparaît pas dans le fichier en tant que mot séparé.

Utilisation de plusieurs termes de recherche

Les -E (expression régulière étendue) vous permet de rechercher plusieurs mots. (Les -E option remplacer les obsolètes egrep version de grep.)

Cette commande recherche deux termes de recherche, “moyenne” Oui “sans mem”.

grep -E -w -i "moyenne|sans mem" geek-1.log

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

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

Les -e L'option (motifs) vous permet d'utiliser plusieurs termes de recherche sur la ligne de commande. Nous utilisons la fonction regex brackets pour créer un modèle de recherche. Dé grep pour faire correspondre l’un des caractères entre crochets “[]. ” Ça signifie grep correspondra à « kB » ou « KB » lors de la recherche.

Les deux chaînes correspondent et, en réalité, certaines lignes contiennent les deux chaînes.

Correspondance exacte des lignes

Les -x (expression régulière de ligne) correspondra uniquement aux lignes où le ligne complète correspond au terme de recherche. Cherchons un horodatage dont nous savons qu'il n'apparaît qu'une seule fois dans le fichier journal:

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

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

Le contraire de cela montre simplement les lignes qui non rencontre. Cela peut être utile lors de la recherche de fichiers de configuration. Les commentaires sont super, mais de temps en temps il est difficile d'identifier la configuration réelle entre tous. Voici la /etc/sudoers Record:

Nous pouvons filtrer efficacement les lignes de commentaires de cette façon:

sudo grep -v "#" /etc/sudoers

C'est beaucoup plus facile à analyser.

Affichage du texte correspondant uniquement

Il peut arriver que vous ne vouliez pas voir toute la ligne correspondante, juste le texte correspondant. Les -o L'option (ne correspond qu'à) fait exactement ça.

grep -o MemFree geek-1.log

L'écran est réduit à afficher uniquement le texte qui correspond au terme de recherche, au lieu de toute la ligne correspondante.

Compter sur grep

grep il ne s'agit pas que de texte, il peut également fournir des informations numériques. Nous pouvons faire grep compte pour nous de différentes manières. Si nous voulons savoir combien de fois une définition de recherche apparaît dans un fichier, nous pouvons utiliser le -c (compter) option.

grep -c moyen geek-1.log

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 à l'aide de la -n option (numéro de ligne).

grep -n Jan geek-1.log

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

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

grep -m5 -n Jan geek-1.log

Ajouter un contexte

Il est souvent utile de pouvoir voir quelques lignes supplémentaires, lignes éventuellement incompatibles, pour chaque ligne correspondante. peut vous aider à distinguer lesquelles des lignes correspondantes sont celles qui vous intéressent.

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

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

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

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

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

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

Afficher les fichiers correspondants

Pour afficher les noms des fichiers qui contiennent le terme de recherche, Utilisez le -l (fichiers correspondants) option. Pour savoir quels fichiers source C contiennent des références au sl.h En tête de fichier, utilise cette commande:

grep -l "sl.h" *.c

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

Oui, résolument, nous pouvons rechercher des fichiers qui ne contiennent pas le terme de recherche. Les -L L'option (fichiers sans correspondance) fait exactement ça.

grep -L "sl.h" *.c

Début et fin de lignes

Nous pouvons forcer grep pour afficher uniquement les correspondances qui sont 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 chercherons des lignes qui ont un espace comme premier caractère:

grep "^ " geek-1.log

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

Pour correspondre à la fin de la ligne, utiliser l’opérateur d’expression régulière “$”. Cherchons les lignes qui se terminent par “00”.

grep "00$" geek-1.log

L’écran affiche les lignes qu’ils ont “00” en tant que caractères finaux.

Utilisation de Pipes avec grep

Résolument, peut canaliser l'entrée vers grep , canaliser la sortie de grep dans un autre programme et avoir grep niché au milieu d'une chaîne de tuyaux.

Disons que nous voulons voir toutes les apparences de la chaîne “ExtraireParamètres” dans nos fichiers de code source C. Nous savons qu'il y en aura plusieurs, nous canalisons donc la sortie vers less:

grep "ExtraireParamètres" *.c | moins

La sortie est présentée dans less.

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 qu’ils contiennent “ExtraireParamètres”. (Nous pourrions y parvenir en utilisant le grep -c (compter) option, mais c'est une belle façon de démontrer le tuyau à l'extérieur grep.)

grep "ExtraireParamètres" *.c | wc -l

Avec la commande suivante, nous canalisons la sortie de ls Dans grep et canaliser la sortie de grep Dans sort . Nous listons les fichiers dans le répertoire courant, sélection de ceux avec la chaîne “août” en eux, et les trier par taille de fichier:

ls -l | grep "août" | trier +4n

Analysons ça:

  • ls -l: Faites une longue liste de fichiers en utilisant ls.
  • grep “Août”: Sélectionnez les lignes du ls liste que vous avez “août” en eux. Notez que cela trouvera également les fichiers qui ont “août” en leur nom.
  • ordonner + 4m: Trier la sortie de grep dans la quatrième colonne ().

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

EN RELATION: Comment utiliser Pipes sur Linux

grep: Moins une commande, plus un allié

grep est un excellent outil à avoir à votre disposition. Sur le 1974 et il est toujours fort parce que nous avons besoin de ce qu'il fait, et rien ne l'améliore.

Couplage grep avec quelques regex, fu passe vraiment au niveau supérieur.

EN RELATION: Comment utiliser des expressions régulières de base pour mieux rechercher et gagner du temps

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.