
Linux grep Il comando è un'utilità di corrispondenza di stringhe e motivi che visualizza le linee di corrispondenza di più file. Funziona anche con output convogliato da altri comandi. Ti mostriamo come.
La storia dietro grep
Il grep Il comando è famoso nei circoli Linux e Unix per tre motivi. Innanzitutto, è estremamente utile. In secondo luogo, la ricchezza di opzioni può essere travolgente. In terzo luogo, è stato scritto durante la notte per soddisfare un bisogno particolare. I primi due vanno a gonfie vele; il terzo è leggermente spento.
Ken Thompson aveva estratto le capacità di ricerca delle espressioni regolari da ed editore (pronunciato ee-dee) e ha creato un piccolo programma – per il suo uso personale – per cercare file di testo. Il suo capo dipartimento alla Bell Labs, Doug Mcilroy, si avvicinò a Thompson e descrisse il problema che uno dei suoi colleghi, Lee McMahon, stava affrontando.
McMahon stava cercando di identificare gli autori dei giornali federalisti attraverso un'analisi testuale. Aveva bisogno di uno strumento in grado di cercare frasi e stringhe all'interno di file di testo. Thompson trascorse circa un'ora quella sera trasformando il suo strumento in un'utilità generale che poteva essere utilizzata da altri e ribattezzata come grep. Ha preso il nome dal ed stringa di comando g/re/p , che si traduce come “ricerca globale di espressioni regolari”.
Puoi vedere Thompson parlare con Brian Kernighan della nascita di grep.
Ricerche semplici con grep
Per cercare una stringa all'interno di un file, passare il termine di ricerca e il nome del file sulla riga di comando:
Vengono visualizzate le linee corrispondenti. In questo caso, è una riga singola. Il testo corrispondente è evidenziato. Questo perché sulla maggior parte delle distribuzioni grep è alias:
alias grep='grep --colour=auto'
Diamo un'occhiata ai risultati in cui sono presenti più righe corrispondenti. Cercheremo la parola “Media” in un file di registro dell'applicazione. Poiché non possiamo ricordare se la parola è in minuscolo nel file di registro, utilizzeremo il -i (ignora caso) opzione:
grep -i Average geek-1.log

Viene visualizzata ogni riga corrispondente, con il testo corrispondente evidenziato in ciascuna.

Possiamo visualizzare le linee non corrispondenti usando l'opzione -v (inverti corrispondenza).
grep -v Mem geek-1.log

Non viene evidenziato perché si tratta di linee non corrispondenti.

Possiamo causare grep essere completamente silenzioso. Il risultato viene passato alla shell come valore di ritorno da grep. Un risultato pari a zero indica la stringa era trovato e un risultato di uno significa che non era trovato. Possiamo controllare il codice di ritorno usando il $? parametri speciali:
grep -q average geek-1.log
echo $?
grep -q howtogeek geek-1.log
echo $?

Ricerche ricorsive con grep
Per cercare tra le directory e le sottodirectory nidificate, utilizzare l'opzione -r (ricorsiva). Tieni presente che non fornisci un nome file sulla riga di comando, devi fornire un percorso. Qui stiamo cercando nella directory corrente “.” e tutte le sottodirectory:
grep -r -i memfree .

L'output include la directory e il nome file di ciascuna riga corrispondente.

Possiamo fare grep seguire i collegamenti simbolici usando il -R (dereference ricorsivo) opzione. Abbiamo un link simbolico in questa directory, chiamato logs-folder. Indica /home/dave/logs.
ls -l logs-folder

Ripetiamo la nostra ultima ricerca con il -R (dereference ricorsivo) opzione:
grep -R -i memfree .

Il collegamento simbolico viene seguito e viene cercata la directory a cui punta grep pure.

Alla ricerca di parole intere
Di default, grep corrisponderà a una riga se il target di ricerca appare in qualsiasi punto di quella riga, incluso all'interno di un'altra stringa. Guarda questo esempio. Cercheremo la parola “gratis”.
grep -i free geek-1.log

I risultati sono linee che contengono la stringa “libera”, ma non sono parole separate. Fanno parte della stringa “MemFree”.

Forzare grep per abbinare solo “parole” separate, utilizzare il -w (parola regexp) opzione.
grep -w -i free geek-1.log
echo $?

Questa volta non ci sono risultati perché il termine di ricerca “libero” non appare nel file come una parola separata.
Utilizzo di più termini di ricerca
Il -E (regexp esteso) consente di cercare più parole. (Il -E L'opzione sostituisce il deprecato egrep versione di grep.)
Questo comando cerca due termini di ricerca, “medio” e “memfree”.
grep -E -w -i "average|memfree" geek-1.log

Tutte le righe corrispondenti vengono visualizzate per ciascuno dei termini di ricerca.

Puoi anche cercare più termini che non sono necessariamente parole intere, ma possono anche essere parole intere.
Il -e (pattern) consente di utilizzare più termini di ricerca nella riga di comando. Stiamo utilizzando la funzione di parentesi di espressione regolare per creare un modello di ricerca. Racconta grep per abbinare uno qualsiasi dei caratteri contenuti tra parentesi “()”. Questo significa grep corrisponderà a “kB” o “KB” durante la ricerca.

Entrambe le stringhe sono abbinate e, in effetti, alcune righe contengono entrambe le stringhe.
Linee corrispondenti esattamente
Il -x (line regexp) corrisponderà solo alle righe in cui il linea intera corrisponde al termine di ricerca. Cerchiamo una data e un timestamp che sappiamo apparire solo una volta nel file di registro:
grep -x "20-Jan--06 15:24:35" geek-1.log

La singola riga corrispondente viene trovata e visualizzata.
L'opposto di ciò sta solo mostrando le linee che non fare incontro. Questo può essere utile quando stai guardando i file di configurazione. I commenti sono fantastici, ma a volte è difficile individuare le impostazioni effettive tra tutte. Ecco il /etc/sudoers file:

Siamo in grado di filtrare efficacemente le righe di commento in questo modo:
sudo grep -v "#" /etc/sudoers

È molto più facile da analizzare.
Visualizza solo il testo corrispondente
Potrebbe esserci un'occasione in cui non vuoi vedere l'intera riga corrispondente, ma solo il testo corrispondente. Il -o (solo corrispondenza) l'opzione fa proprio questo.
grep -o MemFree geek-1.log

La visualizzazione è ridotta per mostrare solo il testo corrispondente al termine di ricerca, anziché l'intera riga corrispondente.

Conteggio con grep
grep non si tratta solo di testo, ma può anche fornire informazioni numeriche. Possiamo fare grep conta per noi in diversi modi. Se vogliamo sapere quante volte appare un termine di ricerca in un file, possiamo usare il -c (conta) opzione.
grep -c average geek-1.log

grep segnala che il termine di ricerca appare 240 volte in questo file.
Tu puoi fare grep visualizzare il numero di riga per ogni riga corrispondente utilizzando il -n (numero riga) opzione.
grep -n Jan geek-1.log

Il numero di riga per ciascuna riga corrispondente viene visualizzato all'inizio della riga.

Per ridurre il numero di risultati visualizzati, utilizzare il -m (conteggio massimo) opzione. Limiteremo l'output a cinque righe corrispondenti:
grep -m5 -n Jan geek-1.log

Aggiunta del contesto
Essere in grado di vedere alcune linee aggiuntive – possibilmente linee non corrispondenti – per ogni linea corrispondente è spesso utile. può aiutare a distinguere quali delle linee abbinate sono quelle a cui sei interessato.
Per mostrare alcune righe dopo la riga corrispondente, usa l'opzione -A (dopo il contesto). In questo esempio chiediamo tre righe:
grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log

Per vedere alcune righe prima della riga corrispondente, usa il -B (contesto precedente) opzione.
grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log

E per includere le righe prima e dopo la riga corrispondente, utilizzare il -C (contesto) opzione.
grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log

Visualizzazione dei file corrispondenti
Per vedere i nomi dei file che contengono il termine di ricerca, utilizzare il -l (file con corrispondenza) opzione. Per scoprire quali file di codice sorgente C contengono riferimenti a sl.h file di intestazione, utilizzare questo comando:
grep -l "sl.h" *.c

Vengono elencati i nomi dei file, non le righe corrispondenti.

E, naturalmente, possiamo cercare file che non contengono il termine di ricerca. Il -L (file senza corrispondenza) l'opzione fa proprio questo.
grep -L "sl.h" *.c

Inizio e fine delle righe
Possiamo forzare grep per visualizzare solo le corrispondenze che sono all'inizio o alla fine di una riga. L'operatore di espressione regolare “^” corrisponde all'inizio di una riga. Praticamente tutte le linee all'interno del file di registro conterranno spazi, ma cercheremo le linee che hanno uno spazio come primo carattere:
grep "^ " geek-1.log

Vengono visualizzate le linee che hanno uno spazio come primo carattere — all'inizio della linea.

Per abbinare la fine della riga, utilizzare l'operatore di espressione regolare “$”. Cercheremo le righe che terminano con “00”.
grep "00$" geek-1.log

Il display mostra le linee che hanno “00” come caratteri finali.

Utilizzo di Pipes con grep
Ovviamente, puoi reindirizzare l'input a grep , reindirizza l'output da grep in un altro programma, e avere grep incastonato nel mezzo di una catena di tubi.
Supponiamo di voler vedere tutte le occorrenze della stringa “ExtractParameters” nei nostri file di codice sorgente C. Sappiamo che ce ne saranno parecchi, quindi inseriamo l'output less:
grep "ExtractParameters" *.c | less

L'output è presentato in less.

Ciò consente di sfogliare l'elenco dei file e di utilizzarlo less's funzione di ricerca.
Se eseguiamo il pipe dell'output da grep in wc e usa il -l (righe), possiamo contare il numero di righe nei file del codice sorgente che contengono “ExtractParameters”. (Potremmo raggiungere questo obiettivo usando il grep -c (conta) opzione, ma questo è un modo semplice per dimostrare il piping di grep.)
grep "ExtractParameters" *.c | wc -l

Con il comando successivo, stiamo eseguendo il piping dell'output da ls in grep e convoglia l'output da grep in sort . Stiamo elencando i file nella directory corrente, selezionando quelli con la stringa “Aug” in essi e ordinandoli per dimensione del file:
ls -l | grep "Aug" | sort +4n

Analizziamo questo:
-
ls -l: Esegue un elenco di formati lunghi dei file utilizzando
ls. -
grep “ago”: Selezionare le linee da
lselenco che contiene “Aug”. Si noti che questo troverebbe anche i file che hanno “Aug” nei loro nomi. - ordina + 4n: Ordina l'output da grep sulla quarta colonna (dimensione file).
Otteniamo un elenco ordinato di tutti i file modificati in agosto (indipendentemente dall'anno), in ordine crescente di dimensione del file.
RELAZIONATO: Come usare le pipe su Linux
grep: meno un comando, più di un alleato
grep è uno strumento eccezionale da avere a tua disposizione. Risale al 1974 ed è ancora forte perché abbiamo bisogno di ciò che fa, e niente lo fa meglio.
accoppiamento grep con alcune espressioni regolari-fu lo porta davvero al livello successivo.
RELAZIONATO: Come utilizzare le espressioni regolari di base per cercare meglio e risparmiare tempo


