В зависимости от ожидаемого выхода вам может потребоваться поиграть с grep
параметрами
Вот возможное решение:
grep -o pattern * | awk -F: '{a[$1]++;}END{for (i in a)print i, a[i];}'
Объяснение:
Рассмотрим шаблон поиска как строку abc
Я сделал следующие предположения , поскольку они прямо не указаны в вашем вопросе:
- Подсчет множественных вхождений шаблона для каждой строки в каждом файле
- Подсчет вхождений шаблона, которые могут произойти в слове и / или окружен другими символами
- Распечатать имя файла и считать в выводе
Я создал следующие тестовые файлы в том же каталоге что вы намереваетесь выполнить поиск:
file1
с одним вхождением шаблона abc
: ожидаемое число = 1
cat > file1
abc
xyz
file2
с несколькими вхождениями шаблона abc
в одной строке: ожидаемое количество = 2
* 1 050 * file3
с шаблоном, встроенным в слово / окруженным другими символами: ожидаемое число = 5
cat > file3
xabcyz
xabcyabc
123abc
abc_
Шаг 1 :
Используйте grep -o abc *
для генерации следующего вывода:
file1:abc
file2:abc
file2:abc
file3:abc
file3:abc
file3:abc
file3:abc
file3:abc
Что делает опция -o
?
-o, --only-matching
Print only the matched (non-empty) parts of a matching line,
with each such part on a separate output line.
man grep
, чтобы узнать больше grep
вариантов ..
Шаг 2 :
(Примечание : Хотя это не имеет непосредственного отношения к вашему вопросу, я включаю объяснение того, как вышеупомянутые выходные данные агрегируются для подсчета возвращаемых значений)
Рассматривать выходные данные шага 1 как ассоциативный массив a
с индекс: file1, file2 и т. д.
Передать вывод с помощью awk -F: '{a[$1]++;}END{for (i in a)print i, a[i];}'
В команде awk:
- Указать разделитель полей
F
как :
, поскольку нас интересует только первый столбец (т. Е. Индекс массива) a[$1]++
увеличивает счетчик индекса при перемещении по массиву
END{actions}
выполняет то, что вы указали в actions
перед выходом
for (i in a)print i, a[i];
- это значение для l oop, которое печатает каждый индекс i
из массива a
с соответствующим количество a[i]
Окончательный результат:
$ grep -o abc * | awk -F: '{a[$1]++;}END{for (i in a)print i, a[i];}'
file1 1
file2 2
file3 5
Надеюсь, это поможет.