Mouse.The.Lucky.Dog
Mouse.The.Lucky.Dog

Reputation: 755

How to grep two patterns at once

Often times I have to do so commandline thing where I pipe to grep and want matches for two different expressions. ( An OR match A OR B. )

For example I want to grep the output of generate_out for either foo[0-9]+ or bar[0-9]+. I of course could just execute twice:

generate_out| grep "foo[0-9]+"   
generate_out| grep "bar[0-9]+"   

but often generate_out is expensive and I would rather not want to run it twice ( or store it's output ). Rather I would like to just use one expression:

generate_out| grep "foo[0-9]+ OR bar[0-9]+"   

of course this will not work but I would like the equivalent expression which will.

Upvotes: 3

Views: 2199

Answers (3)

glenn jackman
glenn jackman

Reputation: 247162

use grep's -e option to specify multiple patterns that are "OR'ed":

$ seq 15 | grep -e 5 -e 3
3
5
13
15

Upvotes: 4

Ed Morton
Ed Morton

Reputation: 204488

Use awk for simplicity:

generate_out| awk '/foo[0-9]+/ || /bar[0-9]+/'

which of course could be simplified in this particular case to:

generate_out| awk '/(foo|bar)[0-9]+/'

but in general you want to use awk for simple, consistent ORs and ANDs of regexps:

cmd | grep -E 'foo.*bar|bar.*foo'
cmd | awk '/foo/ && /bar/'

cmd | grep 'foo' | grep -v 'bar'
cmd | awk '/foo/ && !/bar/'

cmd | grep -E 'foo|bar'
cmd | awk '/foo/ || /bar/'      (or awk '/foo|bar/')

cmd | grep -E 'foo|bar' | grep -E -v 'foo.*bar|bar.*foo'
cmd | awk '(/foo/ && !/bar/) || (/bar/ && !/foo/)'

Upvotes: 3

Charles Duffy
Charles Duffy

Reputation: 295766

Use an alternation in your regex:

generate_out | grep -E '(foo|bar)[0-9]+'

The use of -E enables ERE features, of this which is one. (By default, grep only supports BRE; some implementations of BRE -- such as GNU's -- may have special syntax for enabling ERE features; in the GNU case, \| in BRE is equivalent to | in ERE; however, it's not portable to rely on such extensions instead of just turning on ERE properly).


egrep is a backwards-compatibility synonym for grep -E; however, only the latter is specified as a requirement by POSIX.

Upvotes: 4

Related Questions