Utilisation de Grep avec plusieurs chaînes

Niraj Menon 22 mars 2022
Utilisation de Grep avec plusieurs chaînes

En tant que scénariste Bash, vous pouvez vous retrouver dans une situation où vous devez analyser un mur de texte pour obtenir des informations pertinentes. Parfois, ces informations ne sont pas ordonnées, ce qui vous oblige à trouver un modèle pour capturer toutes les données pertinentes.

Le meilleur outil pour ce travail sous Linux est grep écrit par Ken Thompson vers 1973. grep est disponible sur tous les systèmes UNIX modernes.

Ce didacticiel couvrira en détail l’utilisation de grep à partir d’exemples de base tels que la capture d’une seule phrase à la capture de plusieurs modèles à l’aide de RegEx ou de chaînes fixes, en supposant une ligne de commande Bash.

Utiliser grep pour capturer des phrases simples

La façon la plus simple d’utiliser grep est de trouver les occurrences d’une phrase dans un fichier. Étant donné un mot cible et un fichier, nous pouvons rechercher le mot dans le fichier comme indiqué.

user@linux:~$ cat file.txt
UNIX
tutorial
word
words
sword
tests
Linux

user@linux:~$ grep word file.txt
word
words
sword

Comme vous pouvez le voir ci-dessus, tous les mots contenant la sous-chaîne word sont capturés.

Vous pouvez également capturer la sortie d’un programme et grep la sortie d’une phrase, comme indiqué. Nous continuerons à utiliser le fichier comme exemple, mais vous pouvez le faire avec n’importe quel programme qui imprime sur stdout.

user@linux:~$ cat file.txt | grep word
word
words
sword

Si vous préférez que grep n’affiche que les phrases qui correspondent exactement (c’est-à-dire qu’elles sont entourées d’espaces et ne sont pas des sous-chaînes d’autres mots), vous pouvez utiliser le drapeau -w/--word-regexp pour activer correspondance des mots.

Vous pouvez utiliser la même idée pour faire correspondre des phrases si elles apparaissent sur une seule ligne, avec -x/--line-regexp.

user@linux:~$ cat file.txt | grep -w word
word

grep avec plusieurs chaînes

Pour utiliser plusieurs phrases, séparées par des retours à la ligne, pour capturer les correspondances pertinentes dans un fichier ou un flux de texte à partir d’un programme, vous pouvez utiliser le -F/--fixed-strings pour les spécifier.

Vous pouvez transmettre une chaîne indiquée ci-dessous à la place pour un petit nombre de correspondances, avec un signe dollar indiquant une nouvelle ligne.

grep -F "words$word" file.txt
# or
fgrep "words$word" file.txt

Pour une plus grande liste à partir d’un fichier, vous pouvez utiliser cat pour afficher le fichier comme argument de grep et réutiliser la même syntaxe.

user@linux:~$ cat match.txt
word
sword
user@linux:~$ fgrep "$(cat match.txt)" file.txt
word
words
sword

grep avec RegEx

Cette section vous sera extrêmement utile si vous êtes familier avec RegEx. En utilisant -E/--extended-regexp, vous pouvez spécifier un modèle RegEx pour capturer des phrases plus compliquées qui ne peuvent pas être capturées avec une ou plusieurs phrases.

Étant donné un fichier contenant des adresses e-mail et des URL au hasard, nous pouvons souhaiter filtrer les lignes qui correspondent aux e-mails, ou URL, avec des invocations séparées de la commande grep.

Un modèle RegEx simple, principalement naïf, pour capturer les e-mails serait [^\@]+\@[^\.]+.*. Pour l’utiliser avec grep, vous pouvez procéder comme suit :

user@linux:~$ cat file.txt 
user@linux.com
linux@torvalds.com
not a URL or email
https://www.google.com/
https://apple.com/
not an email or URL
user@linux:~$ egrep '[^\@]+\@[^\.]+.*' file.txt
user@linux.com
linux@torvalds.com

Un autre exemple qui utilise RegEx consiste à spécifier plusieurs modèles pour voir si chacun d’entre eux existe dans un fichier. Pour ce faire, nous avons le modèle suivant.

Notez la comparaison entre les deux modèles RegEx utilisés dans l’exemple ci-dessous - l’un utilise l’opérateur OU, et l’autre est écrit de telle sorte que la ligne doit contenir les trois mots.

user@linux:~$ cat file.txt
apple banana grape
bus lamppost bench
apple bench grape
bus grape lamppost
yellow apple bus
user@linux:~$ grep -P 'apple|banana|grape' file.txt
apple banana grape
apple bench grape
banana grape apple
bus grape lamppost
yellow apple bus
user@linux:~$ grep -P '^(?=.*apple)(?=.*banana)(?=.*grape)' file.txt
apple banana grape
banana grape apple

N’oubliez pas que grep n’est pas le seul outil de correspondance de chaînes à votre disposition dans les systèmes UNIX. Vous pouvez également utiliser awk pour capturer des modèles compliqués. Vous pouvez également utiliser sed pour remplacer des phrases en fonction de critères de correspondance.

Ce tutoriel dérive des informations de la page de manuel grep, à laquelle vous pouvez accéder en tapant man grep dans n’importe quel terminal UNIX ou sur cette page.