У меня есть много файлов в нескольких подпапках, которые содержат строку 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/"