Вопрос или проблема
В папке находится более 200 файлов, где в некоторых из них встречается следующий шаблон в записях:
ABCD<Пробел><tab><Пробел>,EFGH,<ПРОБЕЛ>,
Не изменяя и не заменяя его, я просто хочу узнать количество файлов с этим форматом.
Grep имеет режим регулярных выражений Perl (-P) и подсчет (-c)
$ grep -c -P 'ABCD\ \t\ ,EFGH,\ ,' file
1
Попробуйте это, чтобы узнать количество файлов, содержащих шаблон
grep -rlP "ABCD \t ,EFGH, " directory | wc -l
r
рекурсивный поиск по файламP
режим Perll
вывод имени каждого входного файла, из которого обычно выводился бы результат. Сканирование остановится на первом совпадении.- подсчет строк
Чтобы получить список файлов:
grep -rlP "ABCD \t ,EFGH, " directory | awk -F "https://unix.stackexchange.com/" '{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
, содержащих хотя бы одно вхождение <пробел><tab><пробел>
.
Рекурсивно:
(cd folder && grep -l $' \t ' .//**/*(D.)) | grep -c //
Рекурсивно, можно также использовать find
:
(cd folder && find .//. -type f -exec grep -l $' \t ' {} +) | grep -c //
Если вы хотите учитывать только файлы, где <пробел><tab><пробел>
найден в первом столбце, измените шаблон на $'^[^,]* \t '
.
Ответ или решение
Чтобы решить задачу по подсчету количества файлов в Unix, содержащих в своих записях определенный шаблон, например, "grep
, find
, и Shell скрипт.
Теория
1. Grep
grep
— это мощная утилита командной строки, используемая для поиска текста или строк в одном или нескольких файлах, которые соответствуют заданному регулярному выражению. В зависимости от используемых аргументов, grep
может выполнять различные задачи, от базового поиска текстовых вхождений до более сложной фильтрации и отображения. Вот основные опции, важные для нашей задачи:
-r
: Выполняет рекурсивный поиск. Полезен, когда нужно искать в подкаталогах.-l
: Выводит только имена файлов, в которых нашелся шаблон.-P
: Позволяет использовать Perl-совместимые регулярные выражения для более сложных шаблонов поиска.-c
: Подсчитывает количество строк, которые совпадают с шаблоном в каждом файле.
2. Perl-совместимые регулярные выражения
Perl-совместимые регулярные выражения отличаются своей выразительностью и возможностью использования расширенных символов и форм. Это позволяет сделать поиск более точным и гибким. В нашем случае использование \t
позволяет указывать на табуляцию, а пробелы можно представить через символы пробела, такие как \s
.
3. Команда Find
find
— это утилита, которая может искать файлы в каталогах, соответствующие заданным критериям. Совместно с grep
, find
можно использовать для осуществления рекурсивного поиска и выполнения команд над найденными файлами.
-type f
: Ищет только файлы и исключает каталоги из поиска.-exec
: Позволяет выполнять команды для найденных файлов.
Пример
Рассмотрим пример использования команды grep
для поиска файлов, содержащих данный шаблон в текущем каталоге:
grep -Psl 'ABCD \t ,EFGH, ' * | wc -l
Этот пример демонстрирует использование grep
для поиска по указанному шаблону в режиме Perl-совместимых регулярных выражений. Команда wc -l
затем подсчитывает количество строк в результате, effectively сообщая количество файлов, содержащих искомую строку.
Применение
1. Основная задача
Задача состоит в том, чтобы без изменения файлов определить количество файлов, содержащих определенный шаблон. Для этого можно использовать приведенные выше команды, чтобы выполнить поиск и подсчет соответствий.
2. Практическое использование
Простой и эффективный способ — запустить команду из командной строки, как продемонстрировано в примере. Однако это решение можно интегрировать в скрипт для автоматизации задачи:
#!/bin/bash
# Путь к каталогу
directory="/путь/к/каталогу"
# Поиск и подсчет файлов с нужным шаблоном
file_count=$(grep -rlP "ABCD \t ,EFGH, " "$directory" | wc -l)
echo "Количество файлов с нужным шаблоном: $file_count"
Элемент автоматизации позволяет использовать скрипт в CRON job, что удобно при частых находках и проверках указанного шаблона.
Заключение
Для профессионалов, работающих с большими объемами данных, таких как 200+ файлов, важно обладать инструментами, которые помогают эффективно управлять задачами поиска и анализа файлов. Использование команд Unix, таких как grep
и find
, позволяет не только решать задачи поиска, но и автоматизировать рутинные операции благодаря возможностям shell скриптов и других утилит. Таким образом, любая задача, связанная с поиском и оценкой наличия определенных данных, становится более управляемой и надежной.