Как найти текстовые файлы с одним шаблоном, используя bash - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь найти текстовые файлы, используя bash, которые не содержат ничего, кроме определенного шаблона в 1 строке файла.

Например, у меня есть следующий текстовый файл:

1234123 123412341 0000 23423 23422
121231 123123 12312 12312 1231
567 567 43 234 12
0000
929 020 040 040 0000

Этот файл содержит строку (строка 4), которая имеет исключительно шаблон 0000.Я пробовал ls | grep 0000, однако, он возвращает также файлы, в которых шаблон находится в другом месте файла и не обязательно «соло» в строке.

Как найти шаблон, использующий bash, который присутствует только в одной строке файла?

1 Ответ

1 голос
/ 24 мая 2019

Предполагая, что у нас есть четыре входных файла:

$ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...