stevo
stevo

Reputation: 181

bash search for multiple patterns on different lines in a file

I have a number of files and I want to filter out the ones that contain 2 patterns. However these patterns are on different lines. I've tried it using grep and awk but in both cases they only seem to work on matches patterns on the same line. I know grep is line based but I'm less familiar with awk. Here's what I came up with but it only works prints lines that match both strings:

awk '/string1/ && /string2/' file

Upvotes: 2

Views: 1110

Answers (4)

Ed Morton
Ed Morton

Reputation: 203254

Depending om whether you really want to search for regexps:

gawk -v RS='^$' '/regexp1/ && /regexp2/ {print FILENAME}' file

or for strings:

gawk -v RS='^$' 'index($0,"string1") && index($0,"string2") {print FILENAME}' file

The above uses GNU awk for multi-char RS to read the whole file as a single record.

Upvotes: 1

Mark Setchell
Mark Setchell

Reputation: 207415

You could do it like this with GNU awk:

awk '/foo/{seenFoo++} /bar/{seenBar++} seenFoo&&seenBar{print FILENAME;seenFoo=seenBar=0;nextfile}' file*

That says... if you see foo, increment variable seenFoo, likewise if you see bar, increment variable seenBar. If, at any point, you have seen both foo and bar, print the name of the current file and skip to the next input file ignoring all remaining lines in current file, and, before you start the next file, clear the flags to say we have seen neither foo nor bar in the new file.

Upvotes: 0

Vytenis Bivainis
Vytenis Bivainis

Reputation: 2376

You can do it with find

find -type f -exec bash -c "grep -q string1 {} && grep -q string2 {} && echo {}"  ";"

Upvotes: 0

l'L'l
l'L'l

Reputation: 47169

Grep will easily handle this using xargs:

grep -l string1 * | xargs grep -l string2

Use this command in the directory where the files are located, and resulting matches will be displayed.

Upvotes: 4

Related Questions