Exemples d'utilisation de la commande grep Linux

click fraud protection

La commande grep Linux est utilisée comme méthode de filtrage des entrées. GREP signifie Global Regular Expression Printer et donc pour l'utiliser efficacement, vous devez avoir quelques connaissances sur les expressions régulières.

Dans cet article, vous apprendrez un certain nombre d'exemples qui vous aideront à comprendre la commande grep.

Comment rechercher une chaîne dans un fichier à l'aide de GREP

La capture d'écran du manuel de la commande grep Linux

Imaginez que vous ayez un fichier texte appelé livres avec les titres de livres pour enfants suivants:

  • Robin des Bois
  • Le petit Chaperon rouge
  • Peter Pan
  • Boucle d'or et les trois ours
  • Blanche-Neige et les sept nains
  • Pinnochio
  • Le chat dans le chapeau
  • Les trois petits cochons
  • Le Gruffalo
  • Charlie et la chocolaterie

Pour trouver tous les livres avec le mot « Le » dans le titre, vous utiliseriez la syntaxe suivante:

grep Les livres. 

Les résultats suivants seront renvoyés:

Boucle d'or et les trois ours
Blanche-Neige et les sept nains
Le chat dans le chapeau
Les trois petits cochons
Le Gruffalo
Charlie et la chocolaterie.

Dans chaque cas, le mot « Le » sera mis en évidence.

La recherche est sensible à la casse, donc si l'un des titres avait "le" au lieu de "Le", il n'aurait pas été renvoyé.

Pour ignorer la casse, vous pouvez ajouter le commutateur suivant:

grep les livres --ignore-case. 

Vous pouvez également utiliser le commutateur -i comme suit:

grep -i les livres. 

Rechercher une chaîne dans un fichier à l'aide d'expressions régulières

La commande grep est très puissante. Vous pouvez utiliser une multitude de techniques de correspondance de modèles pour filtrer les résultats.

Dans cet exemple, nous allons vous montrer comment rechercher une chaîne dans un fichier à l'aide de caractères génériques.

Imaginez que vous ayez un fichier appelé lieux avec les noms de lieux écossais suivants:

aberdeen
aberystwyth
aberreur
inverurie
inverness
newbourg
nouveau cerf
nouveau galloway
glasgow
Edinbourg.

Si vous voulez trouver tous les endroits avec inver dans le nom, utilisez la syntaxe suivante:

grep inver* lieux. 

Le caractère astérisque (*) ne fonctionne pas tout à fait comme dans Bash normal. Dans le contexte de grep, qui traite des expressions régulières, l'astérisque se comporte différemment. Au lieu de faire correspondre tout ou aucun caractère, comme Bash, il correspond au modèle entré plus aucune ou aucune répétition ultérieure de ce modèle.

Dans l'exemple ci-dessus, cela correspond à:

inverurie
inverness.

car ils contiennent tous les deux le modèle "inver" tel qu'il est entré plus zéro répétition supplémentaire de ce modèle. Pour y voir encore plus clair, ajoutez:

répéterinverinverinver. 

à la liste. Non, cela n'a pas beaucoup de sens, mais cela montrera comment fonctionne l'astérisque. Essayez d'exécuter à nouveau la commande.

grep inver* lieux.

Voyez-vous la nouvelle ligne? Cela ne fonctionnerait pas dans Bash, mais c'est le cas ici.

Pour rendre les choses encore plus étranges, exécutez la commande sans l'astérisque.

grep inver lieux. 

Les résultats sont les mêmes. Par défaut, grep recherche un motif à n'importe quel endroit où il apparaît dans une chaîne de texte. Il ne différencie pas non plus le nombre de fois où il apparaît.

Un autre caractère générique que vous pouvez utiliser est le point (.). Vous pouvez l'utiliser pour faire correspondre une seule lettre.

grep inver.r lieux. 

La commande ci-dessus trouverait des endroits appelés inverurie et inverary mais ne trouverait pas invereerie car il ne peut y avoir qu'un seul caractère générique entre les deux r comme indiqué par le point unique.

Le caractère générique du point est utile, mais il peut causer des problèmes si vous en avez un dans le texte que vous recherchez.

Par exemple, regardez cette liste de noms de domaine.

  • linux.lifewire.com
  • pcsupport.lifewire.com
  • mp3.lifewire.com
  • minecraft.lifewire.com
  • androidgames.lifewire.com
  • netforbeginners.lifewire.com
  • dailylinuxuser.com
  • google.co.uk
  • google.au
  • direct.gov.uk
  • fauxsite.lifewire1com.com

Pour trouver toutes les URL de lifewire.com, vous pouvez simplement rechercher en utilisant la syntaxe suivante:

noms de domaine grep .com. 

La commande ci-dessus tomberait si la liste contenait le nom suivant:

dailylinuxuser.com. 

Vous pouvez donc essayer la syntaxe suivante:

noms de domaine grep lifewire.com. 

Cela fonctionnerait bien à moins qu'il n'y ait un domaine avec le nom suivant:

fakesite.lifewire1com.com. 

Pour vraiment rechercher le terme lifewire.com, vous devez échapper au point comme suit:

grep lifewire\\.com noms de domaine. 

Le dernier caractère générique à vous montrer est le point d'interrogation qui représente zéro ou un caractère.

Par exemple:

grep -E ?ber noms de lieux. 

La commande ci-dessus renverrait aberdeen, aberystwyth ou même berwick, si elle figurait sur la liste. Notez également le drapeau supplémentaire « -E ». Grep ne reconnaîtra pas le? caractère sans qu'il permette la prise en charge étendue des expressions régulières.

Rechercher des chaînes au début et à la fin de la ligne à l'aide de grep

Le carat (^) et le symbole dollar ($) vous permettent de rechercher des motifs au début et à la fin des lignes.

Imaginez que vous ayez un fichier appelé football avec les noms d'équipe suivants:

  • Blackpool
  • Liverpool
  • Manchester City
  • La ville de Leicester
  • Manchester United
  • Newcastle United
  • FC United de Manchester

Si vous vouliez trouver toutes les équipes qui ont commencé avec Manchester, vous utiliseriez la syntaxe suivante:

grep ^Équipes de Manchester. 

La commande ci-dessus renverrait Manchester City et Manchester United mais pas le FC United Of Manchester.

Alternativement, vous pouvez trouver toutes les équipes se terminant par United en utilisant la syntaxe suivante:

équipes grep United$. 

La commande ci-dessus reviendrait à Manchester United et Newcastle United mais pas au FC United Of Manchester.

Compter le nombre de correspondances à l'aide de grep

Si vous ne voulez pas renvoyer les lignes réelles qui correspondent à un modèle en utilisant grep mais que vous voulez juste savoir combien il y en a, vous pouvez utiliser la syntaxe suivante:

grep -c fichier d'entrée de modèle. 

Si le motif correspondait deux fois, le numéro 2 serait renvoyé.

Trouver tous les termes qui ne correspondent pas à l'aide de grep

Imaginez que vous ayez une liste de noms de lieux avec les pays répertoriés comme suit:

  • aberdeen Ecosse
  • Glasgow Ecosse
  • Liverpool Angleterre
  • baie de colwyn
  • Londres, Angleterre

Vous avez peut-être remarqué que la baie de Colwyn n'a aucun pays associé.

Pour rechercher tous les lieux avec un pays, vous pouvez utiliser la syntaxe suivante:

grep land$ lieux. 

Les résultats des retours seraient tous les endroits à l'exception de la baie de Colwyn.

Cela ne fonctionne évidemment que pour les endroits qui se terminent par des terres (peu scientifiques).

Vous pouvez inverser la sélection à l'aide de la syntaxe suivante:

grep -v land$ lieux. 

Cela trouverait tous les endroits qui ne se terminaient pas par la terre.

Comment trouver des lignes vides dans des fichiers à l'aide de grep

Imaginez que vous ayez un fichier d'entrée utilisé par une application tierce qui arrête de lire le fichier lorsqu'elle trouve une ligne vide comme suit:

  • aberdeen ecosse
  • inverness ecosse
  • Liverpool Angleterre
  • au Pays de Galles de Colwyn Bay

Lorsque l'application atteint la ligne après Liverpool, elle arrête de lire, ce qui signifie que colwyn bay est complètement raté.

Vous pouvez utiliser grep pour rechercher des lignes vides avec la syntaxe suivante:

grep ^$ lieux. 

Ce n'est pas particulièrement utile car il ne renvoie que les lignes vides.

Vous pouvez, bien sûr, compter le nombre de lignes vides pour vérifier si le fichier est valide comme suit:

grep -c ^$ lieux. 

Il serait cependant plus utile de connaître les numéros de ligne qui ont une ligne vide afin de pouvoir les remplacer. Vous pouvez le faire avec la commande suivante:

grep -n ^$ lieux. 

Comment rechercher des chaînes de caractères majuscules ou minuscules à l'aide de grep

En utilisant grep, vous pouvez déterminer quelles lignes d'un fichier contiennent des caractères majuscules à l'aide de la syntaxe suivante:

grep '[A-Z]' nom de fichier. 

Les crochets [] vous permettent de déterminer la plage de caractères. Dans l'exemple ci-dessus, il correspond à tout caractère compris entre A et Z.

Par conséquent, pour faire correspondre les caractères minuscules, vous pouvez utiliser la syntaxe suivante:

grep '[a-z]' nom de fichier. 

Si vous souhaitez faire correspondre uniquement des lettres et non des chiffres ou d'autres symboles, vous pouvez utiliser la syntaxe suivante:

grep '[a-zA-Z]' nom de fichier. 

Vous pouvez faire la même chose avec les nombres comme suit:

grep '[0-9]' nom de fichier. 

Recherche de motifs répétitifs à l'aide de grep

Vous pouvez utiliser des accolades {} pour rechercher un motif répétitif.

Imaginez que vous ayez un fichier avec les numéros de téléphone suivants:

  • 055-1234
  • 055-4567
  • 555-1545
  • 444-0167
  • 444-0854
  • 4549-2234
  • x44-1234

Vous savez que la première partie du numéro doit être composée de trois chiffres et vous voulez trouver les lignes qui ne correspondent pas à ce modèle.

De l'exemple précédent, vous savez que [0-9] renvoie tous les nombres d'un fichier.

Dans ce cas, nous voulons que les lignes commencent par trois chiffres suivis d'un tiret (-). Vous pouvez le faire avec la syntaxe suivante:

grep "^[0-9][0-9][0-9]-" nombres. 

Comme nous le savons d'après les exemples précédents, le carat (^) signifie que la ligne doit commencer par le motif suivant.

Le [0-9] recherchera n'importe quel nombre entre 0 et 9. Comme il est inclus trois fois, il correspond à 3 nombres. Enfin, il y a un trait d'union pour indiquer qu'un trait d'union doit succéder aux trois nombres.

En utilisant les accolades, vous pouvez réduire la recherche comme suit:

grep "^[0-9]\{3\}-" nombres. 

La barre oblique échappe à la parenthèse { pour qu'elle fonctionne dans le cadre de l'expression régulière, mais en substance, cela signifie [0-9]{3}, ce qui signifie n'importe quel nombre entre 0 et 9 trois fois.

Les accolades peuvent également être utilisées comme suit:

{5,10}
{5,}

Le {5,10} signifie que le caractère recherché doit être répété au moins 5 fois mais pas plus de 10 alors que le {5,} signifie que le caractère doit être répété au moins 5 fois mais il peut être plus de cette.

Utilisation de la sortie d'autres commandes à l'aide de grep

Jusqu'à présent, nous avons examiné la correspondance de motifs dans des fichiers individuels, mais grep peut utiliser la sortie d'autres commandes comme entrée pour la correspondance de motifs.

Un bon exemple de ceci est l'utilisation de la commande ps qui répertorie les processus actifs.

Par exemple, exécutez la commande suivante:

ps -ef. 

Tous les processus en cours sur votre système seront affichés.

Vous pouvez utiliser grep pour rechercher un processus en cours d'exécution particulier comme suit:

ps-ef | grep firefox. 

Sommaire

La commande grep est un élément fondamental Linux et c'est une commande qui vaut la peine d'être apprise car elle vous facilitera la vie lors de la recherche de fichiers et de processus lors de l'utilisation du terminal.