How to run grep with multiple AND patterns?
Clash Royale CLAN TAG#URR8PPP
up vote
75
down vote
favorite
I would like to get the multi pattern match with implicit AND between patterns, i.e. equivalent to running several greps in a sequence:
grep pattern1 | grep pattern2 | ...
So how to convert it to something like?
grep pattern1 & pattern2 & pattern3
I would like to use single grep because I am building arguments dynamically, so everything has to fit in one string. Using filter is system feature, not grep, so it is not an argument for it.
Don't confuse this question with:
grep "pattern1|pattern2|..."
This is an OR multi pattern match.
grep regular-expression
add a comment |Â
up vote
75
down vote
favorite
I would like to get the multi pattern match with implicit AND between patterns, i.e. equivalent to running several greps in a sequence:
grep pattern1 | grep pattern2 | ...
So how to convert it to something like?
grep pattern1 & pattern2 & pattern3
I would like to use single grep because I am building arguments dynamically, so everything has to fit in one string. Using filter is system feature, not grep, so it is not an argument for it.
Don't confuse this question with:
grep "pattern1|pattern2|..."
This is an OR multi pattern match.
grep regular-expression
Similar: Match all patterns from file at once
â kenorb
Dec 22 '16 at 15:26
Similar question on SO: Check if multiple strings or regexes exist in a file
â codeforester
Apr 13 at 17:47
add a comment |Â
up vote
75
down vote
favorite
up vote
75
down vote
favorite
I would like to get the multi pattern match with implicit AND between patterns, i.e. equivalent to running several greps in a sequence:
grep pattern1 | grep pattern2 | ...
So how to convert it to something like?
grep pattern1 & pattern2 & pattern3
I would like to use single grep because I am building arguments dynamically, so everything has to fit in one string. Using filter is system feature, not grep, so it is not an argument for it.
Don't confuse this question with:
grep "pattern1|pattern2|..."
This is an OR multi pattern match.
grep regular-expression
I would like to get the multi pattern match with implicit AND between patterns, i.e. equivalent to running several greps in a sequence:
grep pattern1 | grep pattern2 | ...
So how to convert it to something like?
grep pattern1 & pattern2 & pattern3
I would like to use single grep because I am building arguments dynamically, so everything has to fit in one string. Using filter is system feature, not grep, so it is not an argument for it.
Don't confuse this question with:
grep "pattern1|pattern2|..."
This is an OR multi pattern match.
grep regular-expression
edited Nov 13 '12 at 21:01
dubiousjim
1,9481223
1,9481223
asked Nov 10 '12 at 7:45
greenoldman
2,438103958
2,438103958
Similar: Match all patterns from file at once
â kenorb
Dec 22 '16 at 15:26
Similar question on SO: Check if multiple strings or regexes exist in a file
â codeforester
Apr 13 at 17:47
add a comment |Â
Similar: Match all patterns from file at once
â kenorb
Dec 22 '16 at 15:26
Similar question on SO: Check if multiple strings or regexes exist in a file
â codeforester
Apr 13 at 17:47
Similar: Match all patterns from file at once
â kenorb
Dec 22 '16 at 15:26
Similar: Match all patterns from file at once
â kenorb
Dec 22 '16 at 15:26
Similar question on SO: Check if multiple strings or regexes exist in a file
â codeforester
Apr 13 at 17:47
Similar question on SO: Check if multiple strings or regexes exist in a file
â codeforester
Apr 13 at 17:47
add a comment |Â
7 Answers
7
active
oldest
votes
up vote
65
down vote
accepted
agrep
can do it with this syntax:
agrep 'pattern1;pattern2'
With GNU grep
, when built with PCRE support, you can do:
grep -P '^(?=.*pattern1)(?=.*pattern2)'
With ast grep
:
grep -X '.*pattern1.*&.*pattern2.*'
(adding .*
s as <x>&<y>
matches strings that match both <x>
and <y>
exactly, a&b
would never match as there's no such string that can be both a
and b
at the same time).
If the patterns don't overlap, you may also be able to do:
grep -e 'pattern1.*pattern2' -e 'pattern2.*pattern1'
The best portable way is probably with awk
as already mentioned:
awk '/pattern1/ && /pattern2/'
With sed
:
sed -e '/pattern1/!d' -e '/pattern2/!d'
Please beware that all those will have different regular expression syntax.
1
Theagrep
syntax is not working for me... which version was it introduced in?
â Raman
Sep 5 '16 at 22:15
@Raman 2.04 from 1992 already had it. I've no reason to believe it wasn't there from the start. Newer (after 1992) versions ofagrep
can be found included with glimpse/webglimpse. Possibly you have a different implementation. I had a mistake for the ast-grep version though, the option for augmented regexps is-X
, not-A
.
â Stéphane Chazelas
Sep 6 '16 at 5:55
@StéphaneChazelas Thanks, I haveagrep
0.8.0 on Fedora 23. This appears to be a differentagrep
than the one you reference.
â Raman
Sep 6 '16 at 6:37
1
@Raman, yours sounds like TREagrep
.
â Stéphane Chazelas
Sep 6 '16 at 7:01
1
@Techiee, or justawk '/p1/ && /p2/ n++; END print 0+n'
â Stéphane Chazelas
Jun 28 '17 at 20:23
 |Â
show 5 more comments
up vote
16
down vote
You didn't specify grep version, this is important. Some regexp engines allow multiple matching groupped by AND using '&' but this is non-standard and non-portable feature. But, at least GNU grep doesn't support this.
OTOH you can simply replace grep with sed, awk, perl, etc. (listed in order of weight increasing). With awk, the command would look like
awk '/regexp1/ && /regexp2/ && /regexp3/ print; '
and it can be constructed to be specified in command line in easy way.
3
Just remember thatawk
uses ERE's, e.g. the equivalent ofgrep -E
, as opposed to the BRE's that plaingrep
uses.
â jw013
Nov 10 '12 at 9:42
3
awk
's regexes are called EREs, but in fact they're a bit idiosyncratic. Here are probably more details than anyone cares for: wiki.alpinelinux.org/wiki/Regex
â dubiousjim
Nov 10 '12 at 15:35
Thank you, grep 2.7.3 (openSUSE). I upvoted you, but I will keep question open for a while, maybe there is some trick for grep (not that I dislikeawk
-- simply knowing more is better).
â greenoldman
Nov 10 '12 at 15:42
1
The default action is to print the matching line so theprint;
part isn't really necessary or useful here.
â tripleee
Apr 20 '17 at 11:58
add a comment |Â
up vote
6
down vote
This is not a very good solution but illustrates a somewhat cool "trick"
function chained-grep() chained-grep "$@"
cat something | chained-grep all patterns must match order but matter dont
add a comment |Â
up vote
6
down vote
If patterns.txt
contains one pattern per line, you can do something like this:
awk 'NR==FNRa[$0];nextfor(i in a)if($0!~i)next1' patterns.txt -
To search for fixed strings instead of regular expressions, use this variant:
awk 'NR==FNRa[$0];nextfor(i in a)if(!index($0,i))next1' patterns.txt -
To print all instead of no lines of the input in the case that patterns.txt
is empty, replace NR==FNR
with FILENAME==ARGV[1]
or with ARGIND==1
in gawk
.
add a comment |Â
up vote
2
down vote
git grep
Here is the syntax using git grep
combining multiple patterns using Boolean expressions:
git grep -e pattern1 --and -e pattern2 --and -e pattern3
The above command will print lines matching all the patterns at once.
If the files aren't under version control, add --no-index
param.
Search files in the current directory that is not managed by Git.
Check man git-grep
for help.
See also: Check if all of multiple strings or regexes exist in a file.
add a comment |Â
up vote
2
down vote
This shell command may help:
eval "</dev/stdin $(printf "|grep '%s'" pattern1 pattern2)" FILE
However it's easier if all your patterns are stored in the file, so you can define the following alias:
alias grep-all="cat $(xargs printf '| grep "%s"' < patterns.txt)"
and use it as:
cat text.txt | grep-all
You can of course modify the alias depending on your required syntax, so with this alias:
alias grep-all="</dev/stdin $(xargs printf '|grep "%s"' < patterns.txt)"
you can use just a single command, e.g.
grep-all text.txt
For more ideas, check also: Match all patterns from file at once.
For AND operation per file, see: Check if all of multiple strings or regexes exist in a file.
add a comment |Â
up vote
0
down vote
ripgrep
Here is the example using rg
:
rg -N '(?P<p1>.*pattern1.*)(?P<p2>.*pattern2.*)(?P<p3>.*pattern3.*)' file.txt
It's one of the quickest grepping tools, since it's built on top of Rust's regex engine which uses finite automata, SIMD and aggressive literal optimizations to make searching very fast.
See also related feature request at GH-875.
add a comment |Â
7 Answers
7
active
oldest
votes
7 Answers
7
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
65
down vote
accepted
agrep
can do it with this syntax:
agrep 'pattern1;pattern2'
With GNU grep
, when built with PCRE support, you can do:
grep -P '^(?=.*pattern1)(?=.*pattern2)'
With ast grep
:
grep -X '.*pattern1.*&.*pattern2.*'
(adding .*
s as <x>&<y>
matches strings that match both <x>
and <y>
exactly, a&b
would never match as there's no such string that can be both a
and b
at the same time).
If the patterns don't overlap, you may also be able to do:
grep -e 'pattern1.*pattern2' -e 'pattern2.*pattern1'
The best portable way is probably with awk
as already mentioned:
awk '/pattern1/ && /pattern2/'
With sed
:
sed -e '/pattern1/!d' -e '/pattern2/!d'
Please beware that all those will have different regular expression syntax.
1
Theagrep
syntax is not working for me... which version was it introduced in?
â Raman
Sep 5 '16 at 22:15
@Raman 2.04 from 1992 already had it. I've no reason to believe it wasn't there from the start. Newer (after 1992) versions ofagrep
can be found included with glimpse/webglimpse. Possibly you have a different implementation. I had a mistake for the ast-grep version though, the option for augmented regexps is-X
, not-A
.
â Stéphane Chazelas
Sep 6 '16 at 5:55
@StéphaneChazelas Thanks, I haveagrep
0.8.0 on Fedora 23. This appears to be a differentagrep
than the one you reference.
â Raman
Sep 6 '16 at 6:37
1
@Raman, yours sounds like TREagrep
.
â Stéphane Chazelas
Sep 6 '16 at 7:01
1
@Techiee, or justawk '/p1/ && /p2/ n++; END print 0+n'
â Stéphane Chazelas
Jun 28 '17 at 20:23
 |Â
show 5 more comments
up vote
65
down vote
accepted
agrep
can do it with this syntax:
agrep 'pattern1;pattern2'
With GNU grep
, when built with PCRE support, you can do:
grep -P '^(?=.*pattern1)(?=.*pattern2)'
With ast grep
:
grep -X '.*pattern1.*&.*pattern2.*'
(adding .*
s as <x>&<y>
matches strings that match both <x>
and <y>
exactly, a&b
would never match as there's no such string that can be both a
and b
at the same time).
If the patterns don't overlap, you may also be able to do:
grep -e 'pattern1.*pattern2' -e 'pattern2.*pattern1'
The best portable way is probably with awk
as already mentioned:
awk '/pattern1/ && /pattern2/'
With sed
:
sed -e '/pattern1/!d' -e '/pattern2/!d'
Please beware that all those will have different regular expression syntax.
1
Theagrep
syntax is not working for me... which version was it introduced in?
â Raman
Sep 5 '16 at 22:15
@Raman 2.04 from 1992 already had it. I've no reason to believe it wasn't there from the start. Newer (after 1992) versions ofagrep
can be found included with glimpse/webglimpse. Possibly you have a different implementation. I had a mistake for the ast-grep version though, the option for augmented regexps is-X
, not-A
.
â Stéphane Chazelas
Sep 6 '16 at 5:55
@StéphaneChazelas Thanks, I haveagrep
0.8.0 on Fedora 23. This appears to be a differentagrep
than the one you reference.
â Raman
Sep 6 '16 at 6:37
1
@Raman, yours sounds like TREagrep
.
â Stéphane Chazelas
Sep 6 '16 at 7:01
1
@Techiee, or justawk '/p1/ && /p2/ n++; END print 0+n'
â Stéphane Chazelas
Jun 28 '17 at 20:23
 |Â
show 5 more comments
up vote
65
down vote
accepted
up vote
65
down vote
accepted
agrep
can do it with this syntax:
agrep 'pattern1;pattern2'
With GNU grep
, when built with PCRE support, you can do:
grep -P '^(?=.*pattern1)(?=.*pattern2)'
With ast grep
:
grep -X '.*pattern1.*&.*pattern2.*'
(adding .*
s as <x>&<y>
matches strings that match both <x>
and <y>
exactly, a&b
would never match as there's no such string that can be both a
and b
at the same time).
If the patterns don't overlap, you may also be able to do:
grep -e 'pattern1.*pattern2' -e 'pattern2.*pattern1'
The best portable way is probably with awk
as already mentioned:
awk '/pattern1/ && /pattern2/'
With sed
:
sed -e '/pattern1/!d' -e '/pattern2/!d'
Please beware that all those will have different regular expression syntax.
agrep
can do it with this syntax:
agrep 'pattern1;pattern2'
With GNU grep
, when built with PCRE support, you can do:
grep -P '^(?=.*pattern1)(?=.*pattern2)'
With ast grep
:
grep -X '.*pattern1.*&.*pattern2.*'
(adding .*
s as <x>&<y>
matches strings that match both <x>
and <y>
exactly, a&b
would never match as there's no such string that can be both a
and b
at the same time).
If the patterns don't overlap, you may also be able to do:
grep -e 'pattern1.*pattern2' -e 'pattern2.*pattern1'
The best portable way is probably with awk
as already mentioned:
awk '/pattern1/ && /pattern2/'
With sed
:
sed -e '/pattern1/!d' -e '/pattern2/!d'
Please beware that all those will have different regular expression syntax.
edited Sep 6 '16 at 5:55
answered Nov 10 '12 at 20:13
Stéphane Chazelas
278k52513844
278k52513844
1
Theagrep
syntax is not working for me... which version was it introduced in?
â Raman
Sep 5 '16 at 22:15
@Raman 2.04 from 1992 already had it. I've no reason to believe it wasn't there from the start. Newer (after 1992) versions ofagrep
can be found included with glimpse/webglimpse. Possibly you have a different implementation. I had a mistake for the ast-grep version though, the option for augmented regexps is-X
, not-A
.
â Stéphane Chazelas
Sep 6 '16 at 5:55
@StéphaneChazelas Thanks, I haveagrep
0.8.0 on Fedora 23. This appears to be a differentagrep
than the one you reference.
â Raman
Sep 6 '16 at 6:37
1
@Raman, yours sounds like TREagrep
.
â Stéphane Chazelas
Sep 6 '16 at 7:01
1
@Techiee, or justawk '/p1/ && /p2/ n++; END print 0+n'
â Stéphane Chazelas
Jun 28 '17 at 20:23
 |Â
show 5 more comments
1
Theagrep
syntax is not working for me... which version was it introduced in?
â Raman
Sep 5 '16 at 22:15
@Raman 2.04 from 1992 already had it. I've no reason to believe it wasn't there from the start. Newer (after 1992) versions ofagrep
can be found included with glimpse/webglimpse. Possibly you have a different implementation. I had a mistake for the ast-grep version though, the option for augmented regexps is-X
, not-A
.
â Stéphane Chazelas
Sep 6 '16 at 5:55
@StéphaneChazelas Thanks, I haveagrep
0.8.0 on Fedora 23. This appears to be a differentagrep
than the one you reference.
â Raman
Sep 6 '16 at 6:37
1
@Raman, yours sounds like TREagrep
.
â Stéphane Chazelas
Sep 6 '16 at 7:01
1
@Techiee, or justawk '/p1/ && /p2/ n++; END print 0+n'
â Stéphane Chazelas
Jun 28 '17 at 20:23
1
1
The
agrep
syntax is not working for me... which version was it introduced in?â Raman
Sep 5 '16 at 22:15
The
agrep
syntax is not working for me... which version was it introduced in?â Raman
Sep 5 '16 at 22:15
@Raman 2.04 from 1992 already had it. I've no reason to believe it wasn't there from the start. Newer (after 1992) versions of
agrep
can be found included with glimpse/webglimpse. Possibly you have a different implementation. I had a mistake for the ast-grep version though, the option for augmented regexps is -X
, not -A
.â Stéphane Chazelas
Sep 6 '16 at 5:55
@Raman 2.04 from 1992 already had it. I've no reason to believe it wasn't there from the start. Newer (after 1992) versions of
agrep
can be found included with glimpse/webglimpse. Possibly you have a different implementation. I had a mistake for the ast-grep version though, the option for augmented regexps is -X
, not -A
.â Stéphane Chazelas
Sep 6 '16 at 5:55
@StéphaneChazelas Thanks, I have
agrep
0.8.0 on Fedora 23. This appears to be a different agrep
than the one you reference.â Raman
Sep 6 '16 at 6:37
@StéphaneChazelas Thanks, I have
agrep
0.8.0 on Fedora 23. This appears to be a different agrep
than the one you reference.â Raman
Sep 6 '16 at 6:37
1
1
@Raman, yours sounds like TRE
agrep
.â Stéphane Chazelas
Sep 6 '16 at 7:01
@Raman, yours sounds like TRE
agrep
.â Stéphane Chazelas
Sep 6 '16 at 7:01
1
1
@Techiee, or just
awk '/p1/ && /p2/ n++; END print 0+n'
â Stéphane Chazelas
Jun 28 '17 at 20:23
@Techiee, or just
awk '/p1/ && /p2/ n++; END print 0+n'
â Stéphane Chazelas
Jun 28 '17 at 20:23
 |Â
show 5 more comments
up vote
16
down vote
You didn't specify grep version, this is important. Some regexp engines allow multiple matching groupped by AND using '&' but this is non-standard and non-portable feature. But, at least GNU grep doesn't support this.
OTOH you can simply replace grep with sed, awk, perl, etc. (listed in order of weight increasing). With awk, the command would look like
awk '/regexp1/ && /regexp2/ && /regexp3/ print; '
and it can be constructed to be specified in command line in easy way.
3
Just remember thatawk
uses ERE's, e.g. the equivalent ofgrep -E
, as opposed to the BRE's that plaingrep
uses.
â jw013
Nov 10 '12 at 9:42
3
awk
's regexes are called EREs, but in fact they're a bit idiosyncratic. Here are probably more details than anyone cares for: wiki.alpinelinux.org/wiki/Regex
â dubiousjim
Nov 10 '12 at 15:35
Thank you, grep 2.7.3 (openSUSE). I upvoted you, but I will keep question open for a while, maybe there is some trick for grep (not that I dislikeawk
-- simply knowing more is better).
â greenoldman
Nov 10 '12 at 15:42
1
The default action is to print the matching line so theprint;
part isn't really necessary or useful here.
â tripleee
Apr 20 '17 at 11:58
add a comment |Â
up vote
16
down vote
You didn't specify grep version, this is important. Some regexp engines allow multiple matching groupped by AND using '&' but this is non-standard and non-portable feature. But, at least GNU grep doesn't support this.
OTOH you can simply replace grep with sed, awk, perl, etc. (listed in order of weight increasing). With awk, the command would look like
awk '/regexp1/ && /regexp2/ && /regexp3/ print; '
and it can be constructed to be specified in command line in easy way.
3
Just remember thatawk
uses ERE's, e.g. the equivalent ofgrep -E
, as opposed to the BRE's that plaingrep
uses.
â jw013
Nov 10 '12 at 9:42
3
awk
's regexes are called EREs, but in fact they're a bit idiosyncratic. Here are probably more details than anyone cares for: wiki.alpinelinux.org/wiki/Regex
â dubiousjim
Nov 10 '12 at 15:35
Thank you, grep 2.7.3 (openSUSE). I upvoted you, but I will keep question open for a while, maybe there is some trick for grep (not that I dislikeawk
-- simply knowing more is better).
â greenoldman
Nov 10 '12 at 15:42
1
The default action is to print the matching line so theprint;
part isn't really necessary or useful here.
â tripleee
Apr 20 '17 at 11:58
add a comment |Â
up vote
16
down vote
up vote
16
down vote
You didn't specify grep version, this is important. Some regexp engines allow multiple matching groupped by AND using '&' but this is non-standard and non-portable feature. But, at least GNU grep doesn't support this.
OTOH you can simply replace grep with sed, awk, perl, etc. (listed in order of weight increasing). With awk, the command would look like
awk '/regexp1/ && /regexp2/ && /regexp3/ print; '
and it can be constructed to be specified in command line in easy way.
You didn't specify grep version, this is important. Some regexp engines allow multiple matching groupped by AND using '&' but this is non-standard and non-portable feature. But, at least GNU grep doesn't support this.
OTOH you can simply replace grep with sed, awk, perl, etc. (listed in order of weight increasing). With awk, the command would look like
awk '/regexp1/ && /regexp2/ && /regexp3/ print; '
and it can be constructed to be specified in command line in easy way.
answered Nov 10 '12 at 8:34
Netch
1,764810
1,764810
3
Just remember thatawk
uses ERE's, e.g. the equivalent ofgrep -E
, as opposed to the BRE's that plaingrep
uses.
â jw013
Nov 10 '12 at 9:42
3
awk
's regexes are called EREs, but in fact they're a bit idiosyncratic. Here are probably more details than anyone cares for: wiki.alpinelinux.org/wiki/Regex
â dubiousjim
Nov 10 '12 at 15:35
Thank you, grep 2.7.3 (openSUSE). I upvoted you, but I will keep question open for a while, maybe there is some trick for grep (not that I dislikeawk
-- simply knowing more is better).
â greenoldman
Nov 10 '12 at 15:42
1
The default action is to print the matching line so theprint;
part isn't really necessary or useful here.
â tripleee
Apr 20 '17 at 11:58
add a comment |Â
3
Just remember thatawk
uses ERE's, e.g. the equivalent ofgrep -E
, as opposed to the BRE's that plaingrep
uses.
â jw013
Nov 10 '12 at 9:42
3
awk
's regexes are called EREs, but in fact they're a bit idiosyncratic. Here are probably more details than anyone cares for: wiki.alpinelinux.org/wiki/Regex
â dubiousjim
Nov 10 '12 at 15:35
Thank you, grep 2.7.3 (openSUSE). I upvoted you, but I will keep question open for a while, maybe there is some trick for grep (not that I dislikeawk
-- simply knowing more is better).
â greenoldman
Nov 10 '12 at 15:42
1
The default action is to print the matching line so theprint;
part isn't really necessary or useful here.
â tripleee
Apr 20 '17 at 11:58
3
3
Just remember that
awk
uses ERE's, e.g. the equivalent of grep -E
, as opposed to the BRE's that plain grep
uses.â jw013
Nov 10 '12 at 9:42
Just remember that
awk
uses ERE's, e.g. the equivalent of grep -E
, as opposed to the BRE's that plain grep
uses.â jw013
Nov 10 '12 at 9:42
3
3
awk
's regexes are called EREs, but in fact they're a bit idiosyncratic. Here are probably more details than anyone cares for: wiki.alpinelinux.org/wiki/Regexâ dubiousjim
Nov 10 '12 at 15:35
awk
's regexes are called EREs, but in fact they're a bit idiosyncratic. Here are probably more details than anyone cares for: wiki.alpinelinux.org/wiki/Regexâ dubiousjim
Nov 10 '12 at 15:35
Thank you, grep 2.7.3 (openSUSE). I upvoted you, but I will keep question open for a while, maybe there is some trick for grep (not that I dislike
awk
-- simply knowing more is better).â greenoldman
Nov 10 '12 at 15:42
Thank you, grep 2.7.3 (openSUSE). I upvoted you, but I will keep question open for a while, maybe there is some trick for grep (not that I dislike
awk
-- simply knowing more is better).â greenoldman
Nov 10 '12 at 15:42
1
1
The default action is to print the matching line so the
print;
part isn't really necessary or useful here.â tripleee
Apr 20 '17 at 11:58
The default action is to print the matching line so the
print;
part isn't really necessary or useful here.â tripleee
Apr 20 '17 at 11:58
add a comment |Â
up vote
6
down vote
This is not a very good solution but illustrates a somewhat cool "trick"
function chained-grep() chained-grep "$@"
cat something | chained-grep all patterns must match order but matter dont
add a comment |Â
up vote
6
down vote
This is not a very good solution but illustrates a somewhat cool "trick"
function chained-grep() chained-grep "$@"
cat something | chained-grep all patterns must match order but matter dont
add a comment |Â
up vote
6
down vote
up vote
6
down vote
This is not a very good solution but illustrates a somewhat cool "trick"
function chained-grep() chained-grep "$@"
cat something | chained-grep all patterns must match order but matter dont
This is not a very good solution but illustrates a somewhat cool "trick"
function chained-grep() chained-grep "$@"
cat something | chained-grep all patterns must match order but matter dont
answered Nov 26 '16 at 22:13
olejorgenb
43637
43637
add a comment |Â
add a comment |Â
up vote
6
down vote
If patterns.txt
contains one pattern per line, you can do something like this:
awk 'NR==FNRa[$0];nextfor(i in a)if($0!~i)next1' patterns.txt -
To search for fixed strings instead of regular expressions, use this variant:
awk 'NR==FNRa[$0];nextfor(i in a)if(!index($0,i))next1' patterns.txt -
To print all instead of no lines of the input in the case that patterns.txt
is empty, replace NR==FNR
with FILENAME==ARGV[1]
or with ARGIND==1
in gawk
.
add a comment |Â
up vote
6
down vote
If patterns.txt
contains one pattern per line, you can do something like this:
awk 'NR==FNRa[$0];nextfor(i in a)if($0!~i)next1' patterns.txt -
To search for fixed strings instead of regular expressions, use this variant:
awk 'NR==FNRa[$0];nextfor(i in a)if(!index($0,i))next1' patterns.txt -
To print all instead of no lines of the input in the case that patterns.txt
is empty, replace NR==FNR
with FILENAME==ARGV[1]
or with ARGIND==1
in gawk
.
add a comment |Â
up vote
6
down vote
up vote
6
down vote
If patterns.txt
contains one pattern per line, you can do something like this:
awk 'NR==FNRa[$0];nextfor(i in a)if($0!~i)next1' patterns.txt -
To search for fixed strings instead of regular expressions, use this variant:
awk 'NR==FNRa[$0];nextfor(i in a)if(!index($0,i))next1' patterns.txt -
To print all instead of no lines of the input in the case that patterns.txt
is empty, replace NR==FNR
with FILENAME==ARGV[1]
or with ARGIND==1
in gawk
.
If patterns.txt
contains one pattern per line, you can do something like this:
awk 'NR==FNRa[$0];nextfor(i in a)if($0!~i)next1' patterns.txt -
To search for fixed strings instead of regular expressions, use this variant:
awk 'NR==FNRa[$0];nextfor(i in a)if(!index($0,i))next1' patterns.txt -
To print all instead of no lines of the input in the case that patterns.txt
is empty, replace NR==FNR
with FILENAME==ARGV[1]
or with ARGIND==1
in gawk
.
edited Dec 25 '16 at 10:47
Alex Stragies
3,0891436
3,0891436
answered Mar 18 '16 at 15:25
user4669748
50946
50946
add a comment |Â
add a comment |Â
up vote
2
down vote
git grep
Here is the syntax using git grep
combining multiple patterns using Boolean expressions:
git grep -e pattern1 --and -e pattern2 --and -e pattern3
The above command will print lines matching all the patterns at once.
If the files aren't under version control, add --no-index
param.
Search files in the current directory that is not managed by Git.
Check man git-grep
for help.
See also: Check if all of multiple strings or regexes exist in a file.
add a comment |Â
up vote
2
down vote
git grep
Here is the syntax using git grep
combining multiple patterns using Boolean expressions:
git grep -e pattern1 --and -e pattern2 --and -e pattern3
The above command will print lines matching all the patterns at once.
If the files aren't under version control, add --no-index
param.
Search files in the current directory that is not managed by Git.
Check man git-grep
for help.
See also: Check if all of multiple strings or regexes exist in a file.
add a comment |Â
up vote
2
down vote
up vote
2
down vote
git grep
Here is the syntax using git grep
combining multiple patterns using Boolean expressions:
git grep -e pattern1 --and -e pattern2 --and -e pattern3
The above command will print lines matching all the patterns at once.
If the files aren't under version control, add --no-index
param.
Search files in the current directory that is not managed by Git.
Check man git-grep
for help.
See also: Check if all of multiple strings or regexes exist in a file.
git grep
Here is the syntax using git grep
combining multiple patterns using Boolean expressions:
git grep -e pattern1 --and -e pattern2 --and -e pattern3
The above command will print lines matching all the patterns at once.
If the files aren't under version control, add --no-index
param.
Search files in the current directory that is not managed by Git.
Check man git-grep
for help.
See also: Check if all of multiple strings or regexes exist in a file.
edited Apr 15 at 1:57
answered Apr 11 at 0:53
kenorb
7,32836296
7,32836296
add a comment |Â
add a comment |Â
up vote
2
down vote
This shell command may help:
eval "</dev/stdin $(printf "|grep '%s'" pattern1 pattern2)" FILE
However it's easier if all your patterns are stored in the file, so you can define the following alias:
alias grep-all="cat $(xargs printf '| grep "%s"' < patterns.txt)"
and use it as:
cat text.txt | grep-all
You can of course modify the alias depending on your required syntax, so with this alias:
alias grep-all="</dev/stdin $(xargs printf '|grep "%s"' < patterns.txt)"
you can use just a single command, e.g.
grep-all text.txt
For more ideas, check also: Match all patterns from file at once.
For AND operation per file, see: Check if all of multiple strings or regexes exist in a file.
add a comment |Â
up vote
2
down vote
This shell command may help:
eval "</dev/stdin $(printf "|grep '%s'" pattern1 pattern2)" FILE
However it's easier if all your patterns are stored in the file, so you can define the following alias:
alias grep-all="cat $(xargs printf '| grep "%s"' < patterns.txt)"
and use it as:
cat text.txt | grep-all
You can of course modify the alias depending on your required syntax, so with this alias:
alias grep-all="</dev/stdin $(xargs printf '|grep "%s"' < patterns.txt)"
you can use just a single command, e.g.
grep-all text.txt
For more ideas, check also: Match all patterns from file at once.
For AND operation per file, see: Check if all of multiple strings or regexes exist in a file.
add a comment |Â
up vote
2
down vote
up vote
2
down vote
This shell command may help:
eval "</dev/stdin $(printf "|grep '%s'" pattern1 pattern2)" FILE
However it's easier if all your patterns are stored in the file, so you can define the following alias:
alias grep-all="cat $(xargs printf '| grep "%s"' < patterns.txt)"
and use it as:
cat text.txt | grep-all
You can of course modify the alias depending on your required syntax, so with this alias:
alias grep-all="</dev/stdin $(xargs printf '|grep "%s"' < patterns.txt)"
you can use just a single command, e.g.
grep-all text.txt
For more ideas, check also: Match all patterns from file at once.
For AND operation per file, see: Check if all of multiple strings or regexes exist in a file.
This shell command may help:
eval "</dev/stdin $(printf "|grep '%s'" pattern1 pattern2)" FILE
However it's easier if all your patterns are stored in the file, so you can define the following alias:
alias grep-all="cat $(xargs printf '| grep "%s"' < patterns.txt)"
and use it as:
cat text.txt | grep-all
You can of course modify the alias depending on your required syntax, so with this alias:
alias grep-all="</dev/stdin $(xargs printf '|grep "%s"' < patterns.txt)"
you can use just a single command, e.g.
grep-all text.txt
For more ideas, check also: Match all patterns from file at once.
For AND operation per file, see: Check if all of multiple strings or regexes exist in a file.
edited Apr 19 at 18:10
answered Dec 22 '16 at 16:01
kenorb
7,32836296
7,32836296
add a comment |Â
add a comment |Â
up vote
0
down vote
ripgrep
Here is the example using rg
:
rg -N '(?P<p1>.*pattern1.*)(?P<p2>.*pattern2.*)(?P<p3>.*pattern3.*)' file.txt
It's one of the quickest grepping tools, since it's built on top of Rust's regex engine which uses finite automata, SIMD and aggressive literal optimizations to make searching very fast.
See also related feature request at GH-875.
add a comment |Â
up vote
0
down vote
ripgrep
Here is the example using rg
:
rg -N '(?P<p1>.*pattern1.*)(?P<p2>.*pattern2.*)(?P<p3>.*pattern3.*)' file.txt
It's one of the quickest grepping tools, since it's built on top of Rust's regex engine which uses finite automata, SIMD and aggressive literal optimizations to make searching very fast.
See also related feature request at GH-875.
add a comment |Â
up vote
0
down vote
up vote
0
down vote
ripgrep
Here is the example using rg
:
rg -N '(?P<p1>.*pattern1.*)(?P<p2>.*pattern2.*)(?P<p3>.*pattern3.*)' file.txt
It's one of the quickest grepping tools, since it's built on top of Rust's regex engine which uses finite automata, SIMD and aggressive literal optimizations to make searching very fast.
See also related feature request at GH-875.
ripgrep
Here is the example using rg
:
rg -N '(?P<p1>.*pattern1.*)(?P<p2>.*pattern2.*)(?P<p3>.*pattern3.*)' file.txt
It's one of the quickest grepping tools, since it's built on top of Rust's regex engine which uses finite automata, SIMD and aggressive literal optimizations to make searching very fast.
See also related feature request at GH-875.
edited Apr 11 at 9:18
answered Apr 11 at 1:19
kenorb
7,32836296
7,32836296
add a comment |Â
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f55359%2fhow-to-run-grep-with-multiple-and-patterns%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Similar: Match all patterns from file at once
â kenorb
Dec 22 '16 at 15:26
Similar question on SO: Check if multiple strings or regexes exist in a file
â codeforester
Apr 13 at 17:47