GREP a list of files for multiple strings on multiple lines

Grep is most definitely not the most exciting tool to talk about. One of the challenges that I recently faced was to list a bunch of text files only with a specific phrase.

For the sake of context, I was looking through emails of course bookings. Luckily, I know that the courses are prefixed with the word COURSE: and the names. After saving all of the files in a directory it was a case of running this command:

grep -l "COURSE: Course 1" *

Nice and simple. I could then find out which ones were booking Course 2:

grep -l "COURSE: Course 2" *

So far so good. The problem I now had was that I wanted to know exactly how many had booked BOTH courses. The courses aren’t on the same line so it’s not so straight forward but there’s a very simple way to find those pesky files.

grep -l "COURSE: Course 1" * | xargs grep -l "COURSE: Course 2"

By piping the file names from the first result into the argument of the next grep – it was easy to find the files that had both courses booked. You can chain this with the pipe as many times as you need to.

Finally, if you’re feeling really swish, then you might want to know how many matches there are rather than list the files:

grep -l "COURSE: Course 1" * | xargs grep -l "COURSE: Course 2" | wc -l

If you’re looking for some tricks to using grep to match (or not match!) strings, then you should check out this article over at The Geek Stuff.