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?
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.
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"