11

I need to grep some files to see which ones contain a certain word:

grep -l word *

Next I need to grep that list of files to see which ones contain a different word. The easy way would probably be to write a script but I don't know quite how to work it.

2
  • 1
    Which grep? GNU grep? Are you on Linux, Solaris, the BSDs? Commented Nov 22, 2015 at 23:26
  • I'm using Linux. Commented Nov 23, 2015 at 2:19

3 Answers 3

14

Assuming none of the file names contain whitespace, single quote, double quote or backslash characters (or start with - with GNU grep), you can do:

grep -l word * | xargs grep word2

Xargs will run the second grep over each file from the first grep.

With GNU grep/xargs or compatible, you can make it more reliable with:

grep -lZ word ./* | xargs -r0 grep word2

Using -Z makes grep print the file names NUL-delimited so it can be used with xargs -0. The -r option to xargs avoids the second grep being run if the first grep doesn't find anything.

-1
grep -l word1 $(grep -l word2 *)

or maybe for one of the two words on the same line:

grep -w 'word1\|word2' *

see here

-1

If you need to find files containing a word and then filter out those files containing another word, you could use a sequence of commands like this:

grep word * | awk -F ':' '{print $1}'|uniq | xargs grep word2
  • grep word * - will show all files containing "word", the filename will be first in the list.
  • awk -F ':' '{print $1}' - will print only the filename of your results
  • uniq - will make sure that you do not print the filename more than once.
  • xargs grep word2 - will again search in the list of files you got.
1
  • @don_crissti But combining pieces grep -l word1 * | xargs -d'\n' grep -l word2 works for anything except newline, which is weird enough almost nobody uses it. Commented Nov 23, 2015 at 3:00

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.