O que você quer fazer é
grep -Fvf tmp file.txt
De man grep
:
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The
empty file contains zero patterns, and
therefore matches nothing. (-f is specified
by POSIX.)
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings,
separated by newlines, any of which is to be
matched. (-F is specified by POSIX.)
-v, --invert-match
Invert the sense of matching, to select non-
matching lines. (-v is specified by POSIX.)
Portanto, -f
informa grep
para ler a lista de padrões que ele irá procurar em um arquivo. -F
é necessário, portanto grep
não interpreta esses padrões como expressões regulares. Assim, dada uma string como foo.bar
, o .
será considerado como literal .
e não como "corresponde a qualquer caractere". Finalmente, o -v
inverte a correspondência, então grep
imprimirá apenas as linhas que não corresponderem a nenhum dos padrões em tmp
. Por exemplo:
$ cat pats
aa
bb
cc
$ cat file.txt
This line has aa
This one contains bb
This one contains none of the patterns
This one contains cc
$ grep -Fvf pats file.txt
This one contains none of the patterns