Найти все строки, содержащие строку - суммировать и подсчитать их

Найти все строки, содержащие строку - суммировать и подсчитать их

У меня есть много файлов в нескольких подпапках, которые содержат строку type="abc_(я не совсем уверен, сколько abc_существует ее вариантов), поэтому я хочу узнать, сколько раз неизвестное слово type="abc_встречается в моих файлах.

Я надеюсь получить что-то вроде строки, содержащей

"type="abc_0815 found 50 times
"type="abc_0816 found 32 times
...

and so on.

Если я сделаю так:

grep -rni 'type="abc_' * | wc

Я уже знаю 14905 его появлений с type="abc_.

Может ли кто-нибудь мне помочь с этим?

решение1

Это используется findдля получения списка файлов, передает его catи анализирует вывод с помощью awk:

find . -type f |
xargs -I xx cat "xx" | awk '/type="abc_/{
  for(i=1;i<=NF;i++){
    if($i~/type="abc_/){ d[$i]++ } } } 
  END{ for(i in d){ print i"\tfound",d[i],"times." } }'

type="abc_4  found 1 times.
type="abc_3  found 2 times.
type="abc_6  found 1 times.
type="abc_2  found 2 times.
type="abc_10 found 3 times.
type="abc_5  found 1 times.

Он использует find вместо simple cat *для большей гибкости в выборе объекта поиска.

xargs .. cat | ..можно сократить с помощьюfind . -type f -exec cat {} + | awk ..

решение2

просто добавьте -cфлаг, чтобы grep посчитал его за вас.

В случае, если результатов со значением 0 слишком много, отфильтруйте их с помощью awk

  grep -rnic 'type="abc_' * | awk -F: '$NF>0' 

решение3

Попробуйте сделать что-то подобное:

grep -rni 'type="abc_' * |sed -n "s/.*\(abc_[0-9]*\).*/\1/p"|uniq -c| sed  "s/\(.*\)\(abc.*\)/\2 found \1 times/"

Связанный контент