27 votes

Utilisation de grep avec une expression régulière pour filtrer les correspondances

J'essaie d'utiliser grep avec -v pour invert-match avec -e pour l'expression régulière. J'ai du mal à obtenir la bonne syntaxe.

J'essaye quelque chose comme

 tail -f logFile | grep -ve "string one|string two"
 

Si je le fais de cette façon, il ne filtre pas Si je le change en

 tail -f logFile | grep -ev "string one|string two"
 

Je reçois

 grep: string one|string two: No such file or directory
 

J'ai essayé d'utiliser () ou des guillemets, mais je n'ai pas pu trouver quoi que ce soit qui fonctionne.

Comment puis-je faire ceci?

46voto

Adam Rosenfield Points 176408

Le problème est que par défaut, vous devez vous échapper de votre |s, pour obtenir une alternance. C'est, grep interprète "foo|bar" comme correspondant à la chaîne littérale "foo|bar" seulement, tandis que le motif "foo\bar" (avec un échappé |) correspond à "foo", "bar".

Pour modifier ce comportement, utilisez l'option-E:

tail -f logFile | grep -vE 'string one|string two'

Vous pouvez également utiliser egrep, ce qui est équivalent à grep -E:

tail -f logFile | egrep -v 'string one|string two'

Aussi, le -e est facultative, sauf si le motif commence par un littéral de trait d'union. grep prend automatiquement le premier non-argument d'option comme le modèle.

4voto

Jay Points 20373

Vous devez échapper au symbole du tuyau lorsque -e est utilisé:

 tail -f logFile | grep -ve "string one\|string two"
 

EDIT: ou, comme l' a souligné @Adam , vous pouvez utiliser l'indicateur -E:

 tail -f logFile | grep -vE "string one|string two"
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X