2009-03-30 13 views
9

Ho una lista di modelli in un file di testo, per il quale io uso bzgrep per abbinare su più file:mentre grep più file, come posso fermarmi dopo la prima corrispondenza?

for pattern in $(cat ~/patterns.txt); do echo $pattern; bzgrep -i $pattern *.bz2; done 

Come faccio a fare bzgrep (grep) fermare dopo la prima partita del modello corrente (I è necessario che si fermi completamente, non si fermi sul grep'ed del file corrente) e prosegua con lo schema successivo. Ho letto sul parametro "-m 1", ma penso che si fermi solo sul file corrente. Qualche idea?

Grazie

risposta

11

tubo all'uscita del grep per head -n 1; che tirerà (&) la prima riga e ignorerà il resto (ad esempio, uccide il pipe sorgente).

4

Si potrebbe desiderare di utilizzare lo switch -q (--quiet o --silent). Quindi verificare se il comando è stato completato correttamente o meno. Questo non produce nulla e interrompe la ricerca immediatamente dopo aver trovato una corrispondenza e restituisce solo il successo o il fallimento.

4
for pattern in $(< ~/patterns.txt); do 
    echo "$pattern" 
    for i in *.bz2; do 
    bzgrep -i "$pattern" "$i" && break 
    done 
done 

È possibile aggiungere un -H a grep per visualizzare nomefile: riga anziché solo riga

1

Ecco un esempio:

for i in ~/bin/*; do grep -m 1 lua $i /dev/null && break; done 

Le stesse opere con bzgrep; dopo la prima partita riuscita, esci dal ciclo.

Includendo /dev/null si ottiene il nome file nel caso in cui si disponga di una specie di dinosauro grep che non riconosce l'opzione -H.

+0

L'uso di 'grep -m 1' sembra la risposta migliore, sorpreso dal fatto che non abbia precedenti voti –

Problemi correlati