web-dev-qa-db-fra.com

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?

40
Hortitude

Le problème est que par défaut, vous devez vous échapper pour obtenir une alternance correcte. Autrement dit, grep interprète "foo | bar" comme correspondant uniquement à la chaîne littérale "foo | bar", tandis que le modèle "foo\| bar" (avec un caractère d'échappement |) correspond à "foo" ou "bar".

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

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

Alternativement, utilisez egrep, qui est équivalent à grep -E:

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

En outre, le -e est facultatif, sauf si votre modèle commence par un tiret littéral. grep prend automatiquement le premier argument sans option comme modèle.

63
Adam Rosenfield

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

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

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

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