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.