2015-08-13 12 views
5

Sto tentando di trovare il numero di corrispondenze per una determinata stringa in un grande progetto. Attualmente, per fare questo con ag Sto usando il seguente comando:Contare il numero totale di corrispondenze nella directory con ag

$ echo 0$(ag -c searchterm | sed -e "s/^.*:/+/") | bc 

che è ovviamente un po 'lungo e non molto intuitivo. C'è un modo migliore per ottenere il numero totale di partite in una directory da ag? Ho esaminato la documentazione e non ho trovato nulla di utile lì.

Edit: Grazie ad un recent commit-ag, i nomi dei file possono essere rimossi con ag invece di sed, quindi questo funziona anche:

$ echo `ag test -c --nofilename | sed "s/$/+/"`0 | bc 

Nota: Mi rendo conto che avrei potuto fare questo con ack -hcl searchterm (Beh, quasi Nel mio caso specifico avrei bisogno di un --ignore-dir building anche lì), ma dato che questo è già un grande progetto (e crescerà considerevolmente), l'aumento di velocità offerto da ag lo rende preferibile (ack richiede circa 3 secondi per cerca il risultato quasi istantaneo di ag), quindi mi piacerebbe k con esso.

+0

Hai mai trovare una risposta a questa domanda? – jjaderberg

+0

@jjaderberg Non esattamente. L'opzione migliore sembra essere l'opzione '--stats 'seguita dall'analisi della riga corretta. (ad esempio, 'ag --stats searchterm | tail -n 5 | head -n 1'). Ho anche inviato una richiesta di pull per un'opzione '--stats-only' che impedisce la stampa di qualsiasi altra cosa, in questo caso' ag --stats searchterm | head -n 1' otterrebbe il numero di partite. In entrambi i casi dovrai comunque filtrare le "corrispondenze" per ottenere solo il numero. – SnoringFrog

risposta

7

Uso lo stesso per abbinare le statistiche. Per esempio.:

>$ ag --stats --java -c 'searchstring' | ag '.*matches' 
>$ 22 matches 
>$ 6 files contained matches 

Filtro con lookahead per stampare solo il numero di partite:

>$ ag --stats --java -c 'searchstring' | ag -o '^[0-9]+(?=\smatches)' 
>$ 22 
2

Ancora nessuna grande soluzione, ma qui è quello che sono riuscito a venire con thusfar per chiunque altro che trova questo:

Se non siete alla ricerca di enormi quantità di file, basta usare ack -hcl searchterm, altrimenti .. .

sono stato in grado di migliorare il comando nella mia interrogazione, sfruttando l'opzione --stats, che aggiunge qualcosa di simile a quanto segue per i risultati di ricerca:

714 matches 
130 files contained matches 
300 files searched 
123968435 bytes searched 
0.126203 seconds 

per uso manuale, che è abbastanza buono (anche se riempie comunque lo schermo di tutte le partite), ma per gli script ho ancora bisogno del numero. Così, a tal fine, sono andato dal comando nella mia interrogazione a questo:

$ ag --stats searchterm | tail -n5 | head -n1 | cut -d" " -f1 

o il più succinta ma meno memorabile

$ ag --stats searchterm | tac | awk 'NR==5 {print $1}' 

(sostituire tac con tail -r se si don' t avere tac)

Per risparmiare un po 'più di digitazione, ho fatto un alias della seconda metà del comando in modo da poter reindirizzare ag --stats al mio alias e ottenere quello che voglio. Quindi, con alias agmatches='tac | awk "NR==5 {print \$1}' posso ottenere solo le partite eseguendo ag --stats searchterm | agmatches.

Ancora sarebbe molto meglio se questi fossero integrati nell'ag per facilitare questo. Ho inviato una richiesta di pull per un'opzione di output --stats-only che aiuterebbe, ma non è ancora arrivato nulla di quello che è disponibile se si costruisce direttamente dal repository, ma non è ancora in una versione stabile, quindi dovrebbe accelerare il elaborare un bocconcino per un numero elevato di risultati.

Problemi correlati