Contanto que seus nomes de arquivos não contenham espaços, tabulações, novas linhas ou caracteres curinga, e se o seu grep
suportar a opção -L
, você poderá fazer da seguinte maneira:
$ cat file1
stringA
stringC
$ cat file2
stringA
stringB
$ grep -L stringB $(grep -l stringA file?)
file1
O grep
executado na subshell $()
imprimirá todos os nomes de arquivos que contiverem stringA
. Esta lista de arquivos é entrada para o comando principal grep
, que lista todos os arquivos que não contêm stringB
.
De man grep
-v, --invert-match Invert the sense of matching, to select non-matching lines. (-v is specified by POSIX.) -L, --files-without-match Suppress normal output; instead print the name of each input file from which no output would normally have been printed. The scanning will stop on the first match. -l, --files-with-matches Suppress normal output; instead print the name of each input file from which output would normally have been printed. The scanning will stop on the first match. (-l is specified by POSIX.)