2013-04-21 10 views
7

Sto cercando di fare una ricerca grep ricorsivo come ad esempio:ricorsivo Grep per mostrare contare solo matchin totale

grep -r -c "foo" /some/directory 

che mi danno auch uscita come:

/some/directory/somefile_2013-04-08.txt:0 
/some/directory/somefile_2013-04-09.txt:1 
/some/directory/somefile_2013-04-10.txt:4 
...etc 

tuttavia, vorrei per ottenere solo il numero totale di partite in tutti i file, come:

Total matches: 5 

ho giocato in giro con alcuni altri esempi come in this thread, anche se non riesco a fare quello che dovrebbe essere così semplice.

risposta

17
grep -ro "foo" /some/directory | wc -l | xargs echo "Total matches :" 

L'opzione -o di grep stampe tutto le occorrenze esistenti di una stringa in un file.

+0

grazie, comando utile. non sono sicuro di quale sia l'esatto, visto che con il tuo esempio ottengo 447 partite e Johns ottengo 392. Dovrò giocarci un po 'di più per sapere che credo. –

+0

Questo comando ha funzionato perfettamente per me comunque. Ho aggiornato il mio esempio per aggiungere una stringa dandoti il ​​risultato al termine del comando. –

+1

Più corrispondenze all'interno di una singola riga producono ciascuna una riga separata di output con '-o'. – chepner

3
matches=$(grep -rch "foo" /some/directory | paste -sd+ - | bc) 
echo "Total matches: $matches" 

Il pezzo di pasta/bc riassume un elenco di numeri. Vedi: Bash command to sum a column of numbers.

+0

wow. comando fantastico :) - È difficile aggiungere "Total matches:" ad esso? –

+0

Ho finito per andare con Halims, perché ha combinato tutto in un'unica riga. Sicuramente manterrò questo a portata di mano, perché potrebbe essere molto utile. ancora. –

1

Se avete solo bisogno del totale, è possibile saltare ottenere il conteggio per ogni file, e solo ottenere un numero totale di linee abbinate:

grep -r "foo" /some/directory | wc -l 
+0

Questo stamperà solo ogni riga dove sono state trovate una o più occorrenze. Ciò non restituirà tutte le occorrenze esistenti di una stringa o un motivo. –

+0

Sei corretto. – btanaka

4

Solo tubo a grep.

grep -r "foo" /some/directory | grep -c "foo" 
Problemi correlati