Isso é esperado.
grep -r -n executará uma grep recursiva, exibindo as linhas que correspondem ao padrão fornecido, prefixadas com o nome do arquivo e o número da linha. Ele fornecerá todas as linhas que tiverem correspondência em cada arquivo.
-nEach output line is preceded by its relative line number in the file, starting at line 1. The line number counter is reset for each file processed.
grep -r -c executará um grep recursivo, exibindo os nomes de arquivos de todos os arquivos considerados, seguido pelo número de correspondências do padrão nesse arquivo. Ele te dará uma linha para cada arquivo.
-cOnly a count of selected lines is written to standard output.
Para obter o número de correspondências de um padrão em qualquer arquivo em um diretório específico (recursivamente), você pode fornecer o resultado de grep -r a wc -l como sugerido na resposta que você link para :
$ grep -r 'pattern' . | wc -l
Para usar somente grep para conseguir isso:
$ grep -r 'pattern' . | grep -c 'pattern'
Embora seja certamente um exagero empregar um mecanismo de expressão regular para este trabalho quando usar wc para contar novas linhas é "a ferramenta certa para o trabalho".
Observe que também há o sinal -o to grep :
-oPrint each match, but only the match, not the entire line.
Isso pode ser útil se você quiser contar cada correspondência individual em cada linha separadamente:
$ grep -r -o 'pattern' . | wc -l
Compare, por exemplo, as seguintes duas invocações grep (em bash ou ksh93 ):
$ grep 'l' <<<"Hello world!" | wc -l
1
$ grep -o 'l' <<<"Hello world!" | wc -l
3