Encontre todas as linhas contendo string - resuma e conte-as

Encontre todas as linhas contendo string - resuma e conte-as

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 findpara obter uma listagem de arquivos, transmiti-lo cate 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 -cflag 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/"

informação relacionada