grep -v is your friend:
grep –help | grep invert
-v, –invert-match select non-matching lines
Also check out the related -L (the complement of -l).
-L, –files-without-match only print FILE names containing no match
You can also use awk for these purposes, since it allows you to perform more complex checks in a clearer way:
Lines not containing foo:
awk ‘!/foo/’
Lines containing neither foo nor bar:
awk ‘!/foo/ && !/bar/’
Lines containing neither foo nor bar which contain either foo2 or bar2:
awk ‘!/foo/ && !/bar/ && (/foo2/ || /bar2/)’
And so on.