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:
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