Come usare il comando grep in Linux

Contenuti

Un prompt del terminale su un PC Linux.

El Linux grep Il comando è un'utilità di corrispondenza di stringhe e modelli che visualizza le righe corrispondenti da più file. Funziona anche con l'output in pipeline di altri comandi. Ti mostriamo come.

La storia dietro grep

il grep Il comando è famoso in Linux e Unix cerchi per tre motivi. Primo, è tremendamente utile. Al secondo posto, il il numero di opzioni può essere schiacciante. Al terzo posto, è stato scritto durante la notte per soddisfare una particolare esigenza. I primi due sono molto buoni; il terzo è leggermente spento.

Ken Thompson avevo estratto il frase normale capacità di ricerca ed editore (pronunciato ee-dee) e ho creato un programmino, per uso personale, per cercare file di testo. Il tuo capo dipartimento presso Bell Labs, Doug Mcilroy, si avvicinò a Thompson e descrisse il problema a uno dei suoi colleghi, Lee McMahon, stavo affrontando.

McMahon stava cercando di identificare gli autori del Documenti federalisti attraverso l'analisi testuale. Avevo bisogno di uno strumento che potesse cercare frasi e stringhe nei file di testo. Thompson ha trascorso circa un'ora quella notte a rendere il suo strumento un'utilità generale che altri avrebbero potuto usare e l'ha rinominato grep. Ha preso il nome di ed catena di comando g/re/p , che si traduce come “Ricerca globale di espressioni regolari”.

Puoi vedere Thompson che parla per Brian Kernighan sulla nascita di grep.

Ricerche semplici con grep

Per cercare una stringa all'interno di un file, passa il termine di ricerca e il nome del file nella riga di comando:

grep dave / eccetera / password en una finestra di terminale

Vengono visualizzate le linee corrispondenti. Per questo caso, è una sola riga. Il testo corrispondente è evidenziato. Questo perché nella maggior parte delle distribuzioni grep ha un alias per:

alias grep = 'grep --color = auto'

Diamo un'occhiata ai risultati in cui ci sono più righe che corrispondono. Cercheremo la parola “Nella media” in un file registro dell'applicazione. Perché non possiamo ricordare se la parola è minuscola nel file di registro, useremo il -i (ignora maiuscole e minuscole) opzione:

grep -i Media geek-1.log

Vengono visualizzate tutte le linee corrispondenti, con il testo corrispondente evidenziato su ciascuno.

Possiamo mostrare le righe che non corrispondono usando l'opzione -v (partita inversa).

grep -v Mem geek-1.log

Non c'è evidenziazione perché queste sono le linee non corrispondenti.

possiamo causare grep stai completamente zitto. Il risultato viene passato alla shell come valore di ritorno di grep. Un risultato pari a zero indica la stringa era trovato, e un risultato di uno significa che non era incontri. Possiamo controllare il codice di ritorno usando il $? parametri speciali:

grep -q medio geek-1.log
eco $?
grep -q systempeaker geek-1.log
eco $?

Ricerche ricorsive con grep

Per cercare directory e sottodirectory nidificate, usa l'opzione -r (ricorsivo). Nota che non fornisci un nome di file sulla riga di comando, deve fornire un percorso. Qui stiamo cercando nella directory corrente “.” ed eventuali sottodirectory:

grep -r -i memfree .

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

possiamo fare grep segui i link simbolici usando il -R (dereferenziazione ricorsiva) opzione. Abbiamo un collegamento simbolico in questa directory, chiamato logs-folder. Indicare /home/dave/logs.

ls -l cartella-logs

Ripetiamo la nostra ultima ricerca con il -R (dereferenziazione ricorsiva) opzione:

grep -R -i memfree .

Segui il collegamento simbolico e cerca nella directory a cui punta. grep Cosa c'è di più.

Alla ricerca di parole intere

Predefinito, grep corrisponderà a una riga se il target di ricerca appare in un punto qualsiasi di quella riga, anche all'interno di un'altra stringa. Guarda questo esempio. Cerchiamo la parola “gratuito”.

grep -i free geek-1.log

I risultati sono righe che dispongono la stringa “gratuito” in loro, ma non sono parole separate. Fanno parte della catena “MemFree”.

Forzare grep solo per abbinare “parole” Separare, Utilizzare il -w (espressione regolare di parola) opzione.

grep -w -i free geek-1.log
eco $?

Questa volta non ci sono risultati perché il termine di ricerca “gratuito” non viene visualizzato nel file come parola separata.

Utilizzo di più termini di ricerca

il -E (espressione regolare estesa) ti permette di cercare più parole. (Il -E opzione sostituire l'obsoleto egrep versione di grep.)

Questo comando cerca due termini di ricerca, “Nella media” e “senza memoria”.

grep -E -w -i "media|senza memoria" 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 L'opzione (modelli) ti consente di utilizzare più termini di ricerca sulla riga di comando. Stiamo usando la funzione delle parentesi regex per creare un modello di ricerca. Dado grep per abbinare uno qualsiasi dei caratteri tra parentesi quadre “[]. ” Questo significa grep corrisponderà a "kB" o "KB" durante la ricerca.

Entrambe le stringhe corrispondono e, in realtà, alcune righe contengono entrambe le stringhe.

Corrispondenza esatta delle linee

il -x (espressione regolare di linea) corrisponderà solo alle righe in cui linea completa corrisponde al termine di ricerca. Cerchiamo un timestamp che sappiamo appare solo una volta nel file di registro:

grep -x "20-gennaio-06 15:24:35" geek-1.log

L'unica riga che corrisponde viene trovata e visualizzata.

L'opposto di questo è solo mostrare le linee che no incontro. Questo può essere utile quando si cercano file di configurazione. I commenti sono fantastici, ma di tanto in tanto è difficile identificare la reale configurazione tra tutti loro. Ecco il /etc/sudoers procedimento:

Possiamo filtrare efficacemente le righe di commento in questo modo:

sudo grep -v "#" /ecc/sudoers

È molto più facile da analizzare.

Visualizzazione solo testo corrispondente

Potrebbe esserci un momento in cui non vuoi vedere l'intera linea di corrispondenza, solo il testo corrispondente. il -o L'opzione (solo partita) fa esattamente questo.

grep -o MemFree geek-1.log

Lo schermo si riduce a mostrare solo il testo che corrisponde al termine di ricerca, invece dell'intera linea corrispondente.

Contando su grep

grep non si tratta solo di testo, può anche fornire informazioni numeriche. possiamo fare grep conta per noi in diversi modi. Se vogliamo sapere quante volte appare una definizione di ricerca in un file, possiamo usare il -c (contare) opzione.

grep -c media geek-1.log

grep segnala che viene visualizzato il termine di ricerca 240 volte in questo file.

Puoi fare grep visualizzare il numero di riga per ogni riga corrispondente utilizzando il -n opzione (numero di riga).

grep -n Jan geek-1.log

Il numero di riga per ogni 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

Aggiungi contesto

Spesso è utile poter vedere qualche riga in più, possibilmente linee non corrispondenti, per ogni riga corrispondente. può aiutarti a distinguere quali delle linee corrispondenti sono quelle che ti interessano.

Per mostrare alcune righe dopo la riga corrispondente, usa l'opzione -A (dopo il contesto). Stiamo richiedendo tre righe in questo esempio:

grep -A 3 -X "20-Jan-06 15:24:35" geek-1.log

Per vedere alcune righe prima della riga corrispondente, usa el -B (contesto prima) 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, usa el -C (contesto) opzione.

grep -C 3 -X "20-Jan-06 15:24:35" geek-1.log

Mostra i file corrispondenti

Per visualizzare i nomi dei file che contengono il termine di ricerca, utilizzare il -l (file corrispondenti) opzione. Per scoprire quali file sorgente C contengono riferimenti al sl.h file di intestazione, usa questo comando:

grep -l "sl.h" *.C

I nomi dei file sono elencati, non le linee corrispondenti.

E, decisamente, possiamo cercare file che non contengono il termine di ricerca. il -L L'opzione (file non corrispondenti) fa esattamente questo.

grep -L "sl.h" *.C

Inizio e fine delle righe

possiamo forzare grep per mostrare solo le corrispondenze che si trovano all'inizio o alla fine di una riga. L'operatore di espressione regolare "^" corrisponde all'inizio di una riga. Praticamente tutte le righe all'interno del file di registro conterranno spazi, ma cercheremo le righe che hanno uno spazio come primo carattere:

grep "^ " geek-1.log

Vengono visualizzate le righe che hanno uno spazio come primo carattere, all'inizio della riga.

Per abbinare la fine della linea, Utilizzare l'operatore di espressioni regolari “$”. Cerchiamo le linee che terminano con “00”.

grep "00$" geek-1.log

Lo schermo mostra le linee che hanno “00” come personaggi finali.

Usare le pipe con grep

Decisamente, può incanalare l'input a grep , convogliare l'uscita di grep in un altro programma e avere grep annidato nel mezzo di una catena di tubi.

Diciamo che vogliamo vedere tutte le apparizioni della catena “EstraiParametri” nei nostri file di codice sorgente C. Sappiamo che ce ne saranno parecchi, quindi canaliamo l'output su less:

grep "EstraiParametri" *.C | meno

L'output è presentato in less.

Ciò consente di sfogliare l'elenco dei file e utilizzare less's funzione di ricerca.

Se canaliamo l'uscita di grep entro wc e usa il -l (Linee) opzione, noi può contare il numero di righe Nei file di codice sorgente che contengono “EstraiParametri”. (Potremmo raggiungere questo obiettivo usando il grep -c (contare) opzione, ma questo è un bel modo per mostrare la pipa all'esterno grep.)

grep "EstraiParametri" *.C | wc -l

Con il seguente comando, stiamo canalizzando l'output di ls entro grep e incanalando l'uscita di grep entro sort . Stiamo elencando i file nella directory corrente, Selezione di quelli con la stringa “agosto” Non è necessario aggiungere l'estensione, e ordinandoli per dimensione del file:

ls -l | grep "agosto" | ordina +4n

Analizziamolo:

  • ls -l: Crea un lungo elenco di file in formato utilizzando ls.
  • grep “Agosto”: Seleziona le linee del ls elenco che hai “agosto” Non è necessario aggiungere l'estensione. Si noti che questo troverà anche i file che hanno “agosto” nei loro nomi.
  • ordine + 4n: Ordina l'output di grep nella quarta colonna ().

Otteniamo un elenco ordinato di tutti i file modificati ad agosto (indipendentemente dall'anno), in ordine crescente di dimensione del file.

IMPARENTATO: Come usare Pipes su Linux

grep: Meno un comando, più un alleato

grep è un ottimo strumento da avere a disposizione. Sul 1974 ed è ancora forte perché abbiamo bisogno di ciò che fa, e niente lo rende migliore.

accoppiamento grep con qualche regex, fu lo porta davvero al livello successivo.

IMPARENTATO: Come utilizzare le espressioni regolari di base per cercare meglio e risparmiare tempo

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.