Sei vicino. Per ottenere un conteggio totale di tutte le occorrenze di "ha" all'interno di tutti i file .txt in una cartella:
grep -o "ha" *.txt | wc -l
Da 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.
Funziona perché ciascuno match viene stampato su una riga separata, consentendo così wc -l contarli tutti.
Per impostazione predefinita, tuttavia, grep trova solo la prima occorrenza su una riga e restituisce l'intera riga. Allo stesso modo, opzione -c trova solo la prima occorrenza in tutte le righe, quindi mostra quante righe hanno avuto 1 (o più) corrispondenze.
MODIFICA:
Ecco un modo per stampare il numero totale di occorrenze all'interno di ogni singolo file (con i nomi dei file):
find *.txt -printf 'echo "$(grep -o "ha" %p | wc -l) %p";' | sh
#Example output
3 file1.txt
1 file2.txt
Spiegazione:
find *.txt - trova i file .txt
-printf - stampa tutto tra le virgolette singole (formattate) sullo standard output, sostituendo le occorrenze di %p con l'output di find (nomi file)
$(grep -o "ha" %p | wc -l) - funziona come sopra
| sh - l'output da -printf (che sono comandi) vengono reindirizzati a una shell ed eseguiti
Nota che printf viene invocato una volta per nome file.
Invece di usare grep , prova a usare ag -c ha SilverSearcher:
1.txt:3
2.txt:1
È più veloce! Se stai usando Ubuntu, puoi installare il pacchetto silversearcher-ag .