Tenho muitos arquivos em várias subpastas que incluem uma string type="abc_
- não tenho certeza de quantas variantes abc_
existem - então quero saber quantas ocorrências do desconhecido type="abc_
estão em meus arquivos.
Eu espero conseguir algo que seja como uma linha contendo
"type="abc_0815 found 50 times
"type="abc_0816 found 32 times
...
and so on.
Se eu gostar disso:
grep -rni 'type="abc_' * | wc
Eu já conheço suas 14.905 ocorrências com type="abc_
.
Alguém pode me ajudar nisso?
Responder1
Isso é usado find
para obter uma listagem de arquivos, transmiti-lo cat
e analisar a saída com 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.
Ele usa find em vez de simple cat *
para ser mais flexível sobre o que procurar.
xargs .. cat | ..
pode ser encurtado comfind . -type f -exec cat {} + | awk ..
Responder2
basta adicionar -c
flag para que o grep conte para você.
Caso haja muitos resultados 0, filtre com awk
grep -rnic 'type="abc_' * | awk -F: '$NF>0'
Responder3
Tente semelhante a isto:
grep -rni 'type="abc_' * |sed -n "s/.*\(abc_[0-9]*\).*/\1/p"|uniq -c| sed "s/\(.*\)\(abc.*\)/\2 found \1 times/"