Grep è uno strumento eccellente quando devi cercare il contenuto di un file.
Di solito, esegui grep su un singolo file come questo:
grep search_term filename
Grep è abbastanza versatile. Se vuoi cercare tutti i file in una directory con grep , usalo in questo modo:
grep search_term *
C'è un problema con esso. Cerca solo in tutti i file nella directory corrente. Non cercherà nelle sottodirectory.
Puoi effettuare cerca grep in tutti i file e in tutte le sottodirectory della directory corrente usando il -r
opzione di ricerca ricorsiva:
grep -r search_term .
Puoi anche specificare il percorso della directory se non ti trovi nella directory in cui desideri eseguire la ricerca:
grep -r search_term directory_path
Questo è stato un breve riassunto. Lascia che ti mostri tutto questo in dettaglio con esempi appropriati in modo che sia più facile da capire.
Ricerca Grep in tutti i file di una directory
Ecco la struttura della directory che userò in questo esempio. Ad eccezione di empty.txt, tutti i file contengono il termine 'semplice' su cui eseguirò la ricerca grep.
[email protected]:~/scripts$ tree
.
├── dir1
│ └── new_script.sh
├── dir2
│ └── your_script.sh
├── dir3
│ ├── empty.txt
│ └── linked.txt -> ../../sample.txt
├── my_script.sh
└── your_script.sh
3 directories, 6 files
Per cercare la parola 'semplice' in tutti i file delle directory correnti, basta usare il carattere jolly (*). Il carattere jolly sostituisce effettivamente il nome di tutti i file e le directory nella directory corrente.
grep simple *
Questo cercherà in tutti i file nelle directory correnti, ma non entrerà nelle sottodirectory. Dal momento che non puoi grep direttamente la ricerca su una directory, mostrerà l'errore "XYZ è una directory" insieme ai risultati della ricerca.
Se non ti trovi nella stessa directory in cui desideri eseguire, puoi specificare il percorso della directory e terminarlo con /*
grep search_term directory_path/*
Fondamentalmente, stai usando il carattere jolly per espandere tutti gli elementi (file e directory) della directory data.
Ora che lo sai, vediamo come puoi eseguire una ricerca ricorsiva con grep in modo che esamini anche i file nelle sottodirectory.
Ricerca ricorsiva Grep in tutte le sottodirectory di una directory
Grep fornisce un -r
opzione per la ricerca ricorsiva. Con questa opzione, grep esaminerà tutti i file nella directory corrente (o specificata) e esaminerà anche tutti i file di tutte le sottodirectory.
Ecco la ricerca ricorsiva che ho eseguito nell'esempio precedente per eseguire una ricerca grep nella cartella corrente:
grep -r simple .
Ecco il risultato:
C'è anche un -R
opzione per la ricerca ricorsiva e funziona quasi come il -r
opzione.
grep -R simple .
Allora, qual è la differenza grep -r
e grep -R
? Solo uno, in realtà. Il -R
è una ricerca dereferenziata, il che significa che seguirà i collegamenti simbolici per andare al file originale (che potrebbe trovarsi in qualche altra parte del sistema).
Dai un'occhiata all'output di -R
cerca nello stesso esempio:
Hai notato che fornisce un risultato di ricerca aggiuntivo con il linked.txt
che è fondamentalmente un collegamento simbolico ed è stato omesso dalla ricerca grep con -r
opzione?
Se non sei nella directory in cui desideri eseguire la ricerca ricorsiva, fornisci semplicemente il percorso assoluto o relativo della directory al comando grep:
grep -r search_term path_to_directory
Suggerimento bonus:escludi una determinata directory dalla ricerca grep ricorsiva
Tutto sembra a posto, ma cosa succede se si desidera escludere una determinata directory dalla ricerca ricorsiva? C'è una disposizione anche per questo. Te l'ho detto, grep è un comando estremamente versatile.
grep -r --exclude-dir=dir_name serach_term directory_path
Non è quello. Puoi escludere più di una sottodirectory dalla ricerca ricorsiva nel modo seguente:
grep -r --exclude-dir={dir1,dir2} serach_term directory_path
Ecco come appaiono le directory escluse nel nostro esempio qui:
E sì, come dimostrato dall'esempio sopra, l'esclusione funziona sia con -r
e -R
opzioni ricorsive.
Per riassumere
Ecco un breve riepilogo dell'utilizzo della ricerca grep per più file e directory:
Comando Grep | Descrizione |
---|---|
stringa grep * | Cerca in tutti i file nella directory corrente |
dir della stringa grep | Cerca in tutti i file nella directory dir |
grep -r stringa . | Ricerca ricorsiva in tutti i file in tutte le sottodirectory |
grep -r stringa dir | Ricerca ricorsiva in tutti i file in tutte le sottodirectory di dir |
grep -R stringa . | Come r ma segue i collegamenti simbolici |
Spero che questo suggerimento rapido di grep ti piaccia. Se vuoi di più, puoi leggere questo tutorial dettagliato sull'uso del comando grep:
Fammi sapere se hai domande o suggerimenti su questo argomento.