Соответствие и в строке с несколькими столбцами в unix

В папке содержится более 200 файлов, в которых некоторые из файлов состоят из следующего шаблона.

ABCD,EFGH,,

Не изменяя и не заменяя его, я просто хочу узнать количество файлов в этом формате.

Grep имеет режим регулярного выражения Perl (-P) и только для подсчета (-c)

 $ grep -c -P 'ABCD\ \t\ ,EFGH,\ ,' file 1 

Попробуйте это, чтобы получить количество файлов с шаблоном

 grep -rlP "ABCD \t ,EFGH, " directory | wc -l 
  • r рекурсивный поиск файлов
  • P Perl mode
  • l распечатайте имя каждого входного файла, из которого обычно выводился бы вывод. Сканирование остановится при первом совпадении.
  • количество строк

Чтобы получить список файлов:

 grep -rlP "ABCD \t ,EFGH, " directory | awk -F '/' '{print $2}' 

Эта команда подсчитывает количество файлов в текущем каталоге, которые содержат совпадения с вашим шаблоном:

 grep -Psl 'ABCD \t ,EFGH, ,' * | wc -l 

(Как и в большинстве других решений, он будет неправильно подсчитывать файлы, содержащие в имени встроенные символы новой строки. В мире GNU вы можете использовать grep -PZsl '...pattern...' * | tr '\n\0' 'X\n' | wc -l чтобы это исправить.)

С zsh

 (cd folder && grep -l $' \t ' ./*(D.)) | grep -c / 

Будет подсчитывать количество обычных файлов в folder которые содержат хотя бы одно вхождение .

Рекурсивный:

 (cd folder && grep -l $' \t ' .//**/*(D.)) | grep -c // 

Вы также можете использовать find :

 (cd folder && find .//. -type f -exec grep -l $' \t ' {} +) | grep -c // 

Если вы хотите рассматривать только файлы, в которых находится в первом столбце, измените шаблон на $'^[^,]* \t ' .