Предполагая, что у нас есть четыре входных файла:
$ head file*
==> file1 <==
0000
0000
==> file2 <==
abcd
0000
abcd
==> file3 <==
0000x
==> file4 <==
abcd
file4
не содержит шаблон вообще, file3
содержит шаблон, но он не находится на отдельной строке, file1
имеет несколько строк, содержащих только шаблон, а file2
имеет ровно одну строку с одним шаблоном.
Чтобы получить все файлы, содержащие шаблон в любом месте:
$ grep -l '0000' file*
file1
file2
file3
Чтобы получитьвсе файлы, содержащие строки, содержащие только шаблон:
$ grep -lx '0000' file*
file1
file2
И если вам нужны только файлы, содержащие ровно одну строку, но только шаблон, вы можете использовать -c
, чтобы сначала получить счет:
$ grep -xc '0000' file*
file1:2
file2:1
file3:0
file4:0
и затем используйте awk для печати только файлов с одним совпадением:
$ grep -xc '0000' file* | awk -F: '$2==1 {print $1}'
file2
С GNU awk вы также можете сделать это напрямую:
$ awk 'BEGINFILE {c=0} /^0000$/ {++c} ENDFILE {if (c==1) print FILENAME}' file*
file2