Você está perto. Para obter uma contagem total de todas as ocorrências de "ha" em todos os arquivos .txt em uma pasta:
grep -o "ha" *.txt | wc -l
De man grep
:
-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with
each such part on a separate output line.
Isso funciona porque a correspondência each é impressa em uma linha separada, permitindo que wc -l
conte todos eles.
Por padrão, no entanto, o grep só encontra a primeira ocorrência em uma linha e produz a linha inteira. Da mesma forma, a opção -c
encontra apenas a primeira ocorrência em todas as linhas e, em seguida, mostra quantas linhas tinham 1 (ou mais) correspondências.
EDITAR:
Aqui está uma maneira de imprimir o número total de ocorrências dentro de cada arquivo individual (com nomes de arquivos):
find *.txt -printf 'echo "$(grep -o "ha" %p | wc -l) %p";' | sh
#Example output
3 file1.txt
1 file2.txt
Explicação:
find *.txt
- encontra arquivos .txt
-printf
- imprime tudo entre aspas simples (formatadas) para a saída padrão, substituindo as ocorrências de %p
pela saída do find (nomes de arquivos)
$(grep -o "ha" %p | wc -l)
- funciona como acima
| sh
- a saída de -printf
(que são comandos) é canalizada para um shell e executada
Observe que o printf é chamado uma vez por nome de arquivo.