I’m trying to use grep with -v for invert-match along with -e for regular expression. I’m having trouble getting the syntax right.
I’m trying something like
tail -f logFile | grep -ve 'string one|string two'
If I do it this way it doesn’t filter If I change it to
tail -f logFile | grep -ev 'string one|string two'
I get
grep: string one|string two: No such file or directory
I have tried using () or quotes, but haven’t been able to find anything that works.
How can I do this?
The problem is that by default, you need to escape your |’s to get proper alternation. That is, grep interprets ‘foo|bar’ as matching the literal string ‘foo|bar’ only, whereas the pattern ‘foo\|bar’ (with an escaped |) matches either ‘foo’ or ‘bar’.
To change this behavior, use the -E flag:
Alternatively, use egrep, which is equivalent to grep -E:
Also, the -e is optional, unless your pattern begins with a literal hyphen. grep automatically takes the first non-option argument as the pattern.