Гид по технологиям

Подсчёт совпадений с grep

4 min read Командная строка Обновлено 18 Nov 2025
Подсчёт совпадений в файлах с grep
Подсчёт совпадений в файлах с grep

Быстрые ссылки

  • Подсчёт совпадений с grep

  • Подсчёт по нескольким файлам

Терминал Bash с подсказкой

Подсчёт совпадений с grep

grep — утилита для поиска текста в файлах или в стандартном потоке. Её обычно используют для поиска строк, соответствующих шаблону или регулярному выражению. Часто нужно не просто найти совпадения, но и посчитать их количество.

Ключевые моменты:

  • grep -c считает количество строк, содержащих хотя бы одно совпадение. Это удобно, когда важны строки, а не общее число вхождений.
  • grep может находить несколько вхождений в одной строке, но -c это не учтёт.

Пример: подсчёт строк с IP-адресом в логе nginx

grep -c "1.2.3.4" /var/log/nginx/access.log

Пример вывода команды grep -c, показан результат подсчёта строк в логе

Если нужно посчитать каждое вхождение (несколько вхождений в строке считаются отдельно), используйте опцию -o: она выводит по одному совпадению на строку. Затем можно пересчитать строки с помощью wc -l:

grep -o "foo" file | wc -l

Иллюстрация: использование grep -o с конвейером в wc -l для подсчёта вхождений

Примечания по точности:

  • grep -o не учитывает перекрывающиеся совпадения (см. раздел «Когда это не работает»).
  • для учёта регистра используйте -i, для расширенных регулярных выражений — -E, для Perl-совместимых — -P (на системах, где доступно).

Важно: если вам нужны перекрывающиеся совпадения (например, вхождения “ana” в “banana” дважды), grep -o не подойдёт; лучше использовать perl или awk.

Подсчёт по нескольким файлам

grep умеет работать сразу с несколькими файлами (через маску, параметры или xargs). При этом он обычно выводит имя файла перед совпадением. При использовании -c он печатает имя файла и число совпадающих строк:

grep "foo" ./*.txt -cH

Вывод grep с указанием имён файлов и количества совпадений

Рекомендация: всегда указывайте -H при возможности обработки нескольких файлов. -H гарантирует печать имени файла даже если передан только один файл, что предотвращает поломку автоматизации, зависящей от наличия имени файла.

Если вы хотите использовать -o, чтобы посчитать все вхождения по всем файлам и при этом получить числа для каждого файла, простая передача в wc -l даст только общее число. Для подсчёта по каждому файлу можно применить комбинацию cut + uniq -c, но рекомендуется сортировать входные данные:

grep -o "foo" ./*.txt | cut -d ':' -f 1 | sort | uniq -c

Этот приём работает так: grep -o выводит строки вида filename:match, cut берёт имя файла, sort упорядочивает, а uniq -c считает уникальные имена.

Альтернативный, более надёжный и эффективный метод — использовать awk для подсчёта вхождений в каждом файле, причём awk умеет считать все (неперекрывающиеся) вхождения в строке с помощью gsub:

awk '{ c[FILENAME] += gsub(/foo/,"&") } END { for (f in c) print c[f], f }' ./*.txt

Объяснение: gsub возвращает число замен в текущей строке; мы суммируем это число в массиве c по имени файла и в конце выводим результаты.

Когда это не работает

  • Перекрывающиеся совпадения. grep -o и gsub не найдут перекрывающиеся вхождения. Для них подойдёт perl:
perl -lne 'while(/(?=(ana))/g){$c++;} END{print $c}' file
  • Бинарные файлы. grep по умолчанию может пропускать бинарные файлы; используйте -a чтобы трактовать их как текст.
  • Спецсимволы в шаблоне. Необходимо экранировать точку, вопросительный знак и т.д., если вы ищете литералы.
  • Очень большие файлы. Конвейеры с большим количеством промежуточных строк могут потребовать больше памяти и времени; лучше использовать потоковые решения (awk, perl) или разбивку по частям.

Быстрый чек-лист на практике

Для инженера DevOps:

  • Используйте -H для совместимости скриптов.
  • Для общего числа вхождений по каталогу применяйте grep -o | wc -l.
  • Для per-file счёта используйте awk-однострочник.

Для аналитика логов:

  • Чётко определите, считаете ли вы строки или отдельные вхождения.
  • Учтите регистр и границы слова (\b в регулярных выражениях).

Для тестировщика:

  • Сверяйте результаты нескольких методов на небольших файлах (grep -o|wc -l vs awk) перед запуском на больших объёмах.

Чит-шит: команды и шаблоны

  • Посчитать строки с шаблоном:
grep -c "pattern" file
  • Посчитать все вхождения в файле:
grep -o "pattern" file | wc -l
  • Посчитать вхождения по каждому файлу:
awk '{ c[FILENAME] += gsub(/pattern/,"&") } END { for (f in c) print c[f], f }' files...
  • Подсчёт с игнорированием регистра:
grep -oi "pattern" file | wc -l

Мини-методология проверки результатов

  1. На небольшом тестовом наборе сравните grep -o|wc -l и awk-метод.
  2. Проверьте реакцию на граничные случаи: пустые строки, спецсимволы, перекрытия.
  3. Прогоните на 1–5 файлов с реальными логами и сверяйте частичные выборки.
  4. Зафиксируйте используемую команду в автоматизации с явными флагами (-H, -i и т. п.).

Быстрый словарь (1 строка)

  • grep: утилита поиска текста; -c: количество совпадающих строк; -o: вывод каждого совпадения на новой строке; wc -l: считает строки; gsub (awk): возвращает число замен в строке.

Диаграмма принятия решения

flowchart TD
  A{Нужно ли считать совпадения?} -->|Нет| B[Отказ от действий]
  A -->|Да| C{Нужны ли все вхождения или только строки?}
  C -->|Только строки| D[grep -c]
  C -->|Все вхождения| E{По всем файлам или по одному?}
  E -->|Один файл| F[grep -o | wc -l]
  E -->|Несколько файлов| G[awk-однострочник или grep -o | cut | sort | uniq -c]
  G --> H[Проверить перекрытия — если нужны, использовать perl]

Итог

grep -c удобен для подсчёта совпадающих строк, но для подсчёта всех вхождений лучше сочетать grep -o и wc -l или сразу использовать awk для пер‑файлового подсчёта. Выбирайте инструмент по требованиям: корректность (перекрытия), производительность и простота интеграции в скрипты.

Ключевые команды приведены выше; перед массовым запуском протестируйте на выборке.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как удалить аккаунт Revolut — полное руководство
Финансы

Как удалить аккаунт Revolut — полное руководство

3D‑текст в CorelDRAW с Extrude
Графический Дизайн

3D‑текст в CorelDRAW с Extrude

Как включить авто‑субтитры в TikTok
Социальные сети

Как включить авто‑субтитры в TikTok

Higan для SNES на Ubuntu — точная эмуляция
Эмуляция

Higan для SNES на Ubuntu — точная эмуляция

Winget: как использовать Windows Package Manager
Инструменты

Winget: как использовать Windows Package Manager

Установка и настройка тем в Windows
Windows

Установка и настройка тем в Windows