I'm looking for a way to search files where two word instances exist in the same file.  I've been using the following to perform my searches up to this point:find . -exec grep -l FIND ME {} \;The problem I'm running into is that if there isn't exactly one space that between FIND and ME, the search result does not yield the file.  How do I adapt the former search string where both words FIND and ME exist in a file as opposed to FIND ME?I'm using AIX.
How to search files where two different words exist?
grep;find;search
With GNU tools:find . -type f  -exec grep -lZ FIND {} + | xargs -r0 grep -l MEYou can do standardly:find . -type f -exec grep -q FIND {} \; -exec grep -l ME {} \;But that would run two greps per file. To avoid running that many greps and still be portable while still allowing any character in file names, you could do:convert_to_xargs() {  sed s/[[:blank:]\\']/\\\\&/g | awk '    {      if (NR > 1) {        printf %s, line        if (!index($0, //)) printf \\        print       }      line = $0    }'    END { print line }'}find .//. -type |  convert_to_xargs |  xargs grep -l FIND |  convert_to_xargs |  xargs grep -l METhe idea being to convert the output of find into a format suitable for xargs (that expects a blank (SPC/TAB/NL, and the other blanks from your locale with some implementations of xargs) separated list of words where single, double quotes and backslashes can escape blanks and each other).Generally you can't post-process the output of find, because it separates the file names with a newline character and doesn't escape the newline characters that are found in file names. For instance if we see:./a./bWe've got no way to know whether it's one file called b in a directory called a<NL>. or if it's the two files a and b.By using .//., because // cannot appear otherwise in a file path as output by find (because there's no such thing as a directory with an empty name and / is not allowed in a file name), we know that if we see a line that contains //, then that's the first line of a new filename. So we can use that awk command to escape all newline characters but those that precede those lines.If we take the example above, find would output in the first case (one file):.//a./bWhich awk escapes to:.//a\./bSo that xargs sees it as one argument. And in the second case (two files):.//a.//bWhich awk would leave as is, so xargs sees two arguments.