56 votes

Grep recherche deux mots dans une ligne

J'ai essayé de trouver un moyen de filtrer une ligne contenant les mots "citron" et "riz". Je sais comment trouver "citron" ou "riz" mais pas les deux. Il n'est pas nécessaire qu'ils soient l'un à côté de l'autre, mais simplement sur la même ligne de texte.

68voto

Fabiano Soriani Points 543

"Les deux sur la même ligne" signifie "'riz' suivi de caractères aléatoires suivis de 'citron' ou l'inverse".

En regex, c'est rice.*lemon o lemon.*rice . Vous pouvez combiner cela en utilisant un | :

grep -E 'rice.*lemon|lemon.*rice' some_file

Si vous voulez utiliser des expressions rationnelles au lieu d'expressions étendues ( -E ) vous avez besoin d'une barre oblique inversée avant le | :

grep 'rice.*lemon\|lemon.*rice' some_file

Pour plus de mots, cela devient vite un peu long et il est généralement plus facile d'utiliser plusieurs appels de grep par exemple :

grep rice some_file | grep lemon | grep chicken

30voto

Aditya Points 12756

Vous pouvez envoyer la sortie de la première commande grep à une autre commande grep et cela correspondra aux deux modèles. Donc, vous pouvez faire quelque chose comme :

grep <first_pattern> <file_name> | grep <second_pattern>

ou,

cat <file_name> | grep <first_pattern> | grep <second_pattern>

Exemple :

Ajoutons du contenu à notre fichier :

$ echo "This line contains lemon." > test_grep.txt
$ echo "This line contains rice." >> test_grep.txt
$ echo "This line contains both lemon and rice." >> test_grep.txt
$ echo "This line doesn't contain any of them." >> test_grep.txt
$ echo "This line also contains both rice and lemon." >> test_grep.txt

Que contient le fichier :

$ cat test_grep.txt 
This line contains lemon.
This line contains rice.
This line contains both lemon and rice.
This line doesn't contain any of them.
This line also contains both rice and lemon.

Maintenant, nous allons grep ce que nous voulons :

$ grep rice test_grep.txt | grep lemon
This line contains both lemon and rice.
This line also contains both rice and lemon.

Nous n'obtenons que les lignes où les deux modèles correspondent. Vous pouvez étendre cette méthode et envoyer la sortie vers une autre commande grep pour obtenir d'autres correspondances "AND".

21voto

David B. Points 211

Bien que la question demande l'utilisation de 'grep', j'ai pensé qu'il pourrait être utile de poster une solution simple de 'awk' :

awk '/lemon/ && /rice/'

On peut facilement ajouter d'autres mots ou d'autres expressions booléennes que "et".

11voto

αғsнιη Points 33236

Une autre idée pour trouver les correspondances dans n'importe quel ordre est d'utiliser :

grep avec -P (Compatibilité avec Perl) et l'option regex de lookahead positif (?=(regex)) :

grep -P '(?=.*?lemon)(?=.*?rice)' infile

o que vous pouvez utiliser ci-dessous, à la place :

grep -P '(?=.*?rice)(?=.*?lemon)' infile
  • Le site .*? signifie la correspondance de tous les caractères . qui se produit zéro fois ou plus * alors qu'ils sont facultatifs et suivis d'un motif( rice o lemon ). Le site ? rend tout ce qui est optionnel avant lui (signifie zéro ou une fois de tout ce qui est assorti). .* )

(?=pattern) : Lookahead positif : La construction d'un lookahead positif est une paire de parenthèses, la parenthèse ouvrante étant suivie d'un point d'interrogation et d'un signe égal.

Cela renverra donc toutes les lignes qui contiennent à la fois lemon y rice dans un ordre aléatoire. Cela permet également d'éviter d'utiliser | et doublé grep s.


Liens externes :
<a href="http://caspar.bgsu.edu/%7Ecourses/Stats/Labs/Handouts/grepadvanced.htm" rel="noreferrer">Sujets avancés de Grep</a><br><a href="http://carijansen.com/2013/03/03/positive-lookahead-grep-for-designers/" rel="noreferrer">Lookahead positif - GREP pour les concepteurs</a>

8voto

netskink Points 181
grep -e foo -e goo

Retourne les résultats pour foo ou goo.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X