Il grep command sta per "stampa di espressioni regolari globali" ed è uno dei comandi più potenti e comunemente usati in Linux.
grep ricerca in uno o più file di input le righe che corrispondono a un determinato modello e scrive ciascuna riga corrispondente nell'output standard. Se non vengono specificati file, grep legge dallo standard input, che di solito è l'output di un altro comando.
In questo articolo, ti mostreremo come utilizzare il grep comando attraverso esempi pratici e spiegazioni dettagliate del più comune GNU grep opzioni.
grep Sintassi del comando #
La sintassi per grep il comando è il seguente:
grep [OPTIONS] PATTERN [FILE...]
Gli elementi tra parentesi quadre sono facoltativi.
OPTIONS- Zero o più opzioni. Grep include una serie di opzioni che ne controllano il comportamento.PATTERN- Modello di ricerca.FILE- Zero o più nomi di file di input.
Per poter cercare il file, l'utente che esegue il comando deve avere accesso in lettura al file.
Cerca una stringa nei file #
L'utilizzo più elementare di grep il comando consiste nel cercare una stringa (testo) in un file.
Ad esempio, per visualizzare tutte le righe contenenti la stringa bash dal /etc/passwd file, eseguiresti il seguente comando:
grep bash /etc/passwd L'output dovrebbe essere simile a questo:
root:x:0:0:root:/root:/bin/bash
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash
Se la stringa include spazi, è necessario racchiuderla tra virgolette singole o doppie:
grep "Gnome Display Manager" /etc/passwd Inverti corrispondenza (escludi) #
Per visualizzare le righe che non corrispondono a un modello, utilizzare il -v ( o --invert-match ) opzione.
Ad esempio, per stampare le righe che non contengono la stringa nologin useresti:
grep -v nologin /etc/passwd root:x:0:0:root:/root:/bin/bash
colord:x:124:124::/var/lib/colord:/bin/false
git:x:994:994:git daemon user:/:/usr/bin/git-shell
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash
Utilizzo di Grep per filtrare l'output di un comando #
L'output di un comando può essere filtrato con grep attraverso le tubazioni e sul terminale verranno stampate solo le linee che corrispondono a un determinato motivo.
Ad esempio, per scoprire quali processi sono in esecuzione sul tuo sistema come utente www-data puoi usare il seguente ps comando:
ps -ef | grep www-data www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www
root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data
www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process
www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process
Puoi anche concatenare più tubi a comando. Come puoi vedere nell'output sopra c'è anche una riga contenente il grep processi. Se non vuoi che quella riga venga mostrata, passa l'output a un altro grep istanza come mostrato di seguito.
ps -ef | grep www-data | grep -v grep www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www
www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process
www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process
Ricerca ricorsiva #
Per cercare ricorsivamente un pattern, invoca grep con il -r opzione (o --recursive ). Quando viene utilizzata questa opzione grep cercherà in tutti i file nella directory specificata, saltando i collegamenti simbolici che si incontrano ricorsivamente.
Per seguire tutti i link simbolici, invece di -r , usa il -R opzione (o --dereference-recursive ).
Ecco un esempio che mostra come cercare la stringa linuxize.com in tutti i file all'interno di /etc directory:
grep -r linuxize.com /etc L'output includerà le righe corrispondenti precedute dal percorso completo del file:
/etc/hosts:127.0.0.1 node2.linuxize.com
/etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;
Se usi il -R opzione, grep seguirà tutti i collegamenti simbolici:
grep -R linuxize.com /etc
Notare l'ultima riga dell'output di seguito. Quella riga non viene stampata quando grep viene invocato con -r perché i file all'interno di sites-enabled di Nginx directory sono collegamenti simbolici ai file di configurazione all'interno di sites-available directory.
/etc/hosts:127.0.0.1 node2.linuxize.com
/etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;
/etc/nginx/sites-enabled/linuxize.com: server_name linuxize.com www.linuxize.com;
Mostra solo il nome file #
Per eliminare l'impostazione predefinita grep emetti e stampa solo i nomi dei file contenenti il modello abbinato, usa il -l ( o --files-with-matches ) opzione.
Il comando seguente cerca in tutti i file che terminano con .conf nella directory di lavoro corrente e stampa solo i nomi dei file contenenti la stringa linuxize.com :
grep -l linuxize.com *.conf L'output sarà simile a questo:
tmux.conf
haproxy.conf
Il -l opzione è solitamente usata in combinazione con l'opzione ricorsiva -R :
grep -Rl linuxize.com /tmp Ricerca senza distinzione tra maiuscole e minuscole #
Per impostazione predefinita, grep fa distinzione tra maiuscole e minuscole. Ciò significa che i caratteri maiuscoli e minuscoli vengono trattati come distinti.
Per ignorare maiuscole e minuscole durante la ricerca, invoca grep con il -i opzione (o --ignore-case ).
Ad esempio, durante la ricerca di Zebra senza alcuna opzione, il seguente comando non mostrerà alcun output, ovvero ci sono righe corrispondenti:
grep Zebra /usr/share/words
Ma se esegui una ricerca senza distinzione tra maiuscole e minuscole utilizzando -i opzione, corrisponderà a lettere maiuscole e minuscole:
grep -i Zebra /usr/share/words Specificando "Zebra" corrisponderà a "zebra", "ZEbrA" o qualsiasi altra combinazione di lettere maiuscole e minuscole per quella stringa.
zebra
zebra's
zebras
Cerca parole complete #
Durante la ricerca di una stringa, grep visualizzerà tutte le righe in cui la stringa è incorporata in stringhe più grandi.
Ad esempio, se cerchi "gnu", tutte le righe in cui "gnu" è incorporato in parole più grandi, come "cygnus" o "magnum", verranno abbinate:
grep gnu /usr/share/words cygnus
gnu
interregnum
lgnu9d
lignum
magnum
magnuson
sphagnum
wingnut
Per restituire solo quelle righe in cui la stringa specificata è una parola intera (racchiusa da caratteri non di parola), usa il -w ( o --word-regexp ) opzione.
a-z , A-Z e 0-9 ) e trattini bassi (_ ). Tutti gli altri caratteri sono considerati caratteri non di parole.
Se esegui lo stesso comando di cui sopra, incluso il -w opzione, il grep il comando restituirà solo quelle righe in cui gnu è incluso come una parola separata.
grep -w gnu /usr/share/words gnu
Mostra numeri di riga #
Il -n ( o --line-number ) l'opzione dice a grep per mostrare il numero di riga delle righe che contengono una stringa che corrisponde a un modello. Quando viene utilizzata questa opzione, grep stampa le corrispondenze sullo standard output con il prefisso del numero di riga.
Ad esempio per visualizzare le righe da /etc/services file contenente la stringa bash preceduto dal numero di riga corrispondente è possibile utilizzare il seguente comando:
grep -n 10000 /etc/services L'output sottostante ci mostra che le corrispondenze si trovano alle righe 10423 e 10424.
10423:ndmp 10000/tcp
10424:ndmp 10000/udp
Conta corrispondenze #
Per stampare un conteggio delle righe corrispondenti sull'output standard, utilizzare il -c ( o --count ) opzione.
Nell'esempio seguente, stiamo contando il numero di account che hanno /usr/bin/zsh come una conchiglia.
regular expressiongrep -c '/usr/bin/zsh' /etc/passwd
4
Modalità silenziosa #
Il -q (o --quiet ) dice a grep per funzionare in modalità silenziosa per non visualizzare nulla sullo standard output. Se viene trovata una corrispondenza, il comando esce con lo stato 0 . Questo è utile quando usi grep negli script di shell in cui vuoi controllare se un file contiene una stringa ed eseguire una determinata azione a seconda del risultato.
Ecco un esempio di utilizzo di grep in modalità silenziosa come comando di prova in un if dichiarazione:
if grep -q PATTERN filename
then
echo pattern found
else
echo pattern not found
fi
Espressione regolare di base #
GNU Grep ha tre set di funzioni per le espressioni regolari, Basic, Extended e Perl-compatibili.
Per impostazione predefinita, grep interpreta il modello come un'espressione regolare di base in cui tutti i caratteri tranne i metacaratteri sono in realtà espressioni regolari che corrispondono a se stesse.
Di seguito è riportato un elenco dei metacaratteri più comunemente utilizzati:
-
Usa il
^simbolo (caret) per abbinare l'espressione all'inizio di una riga. Nell'esempio seguente, la stringakangaroocorrisponderà solo se si verifica all'inizio di una riga.grep "^kangaroo" file.txt -
Usa il
$simbolo (dollaro) per abbinare l'espressione alla fine di una riga. Nell'esempio seguente, la stringakangaroocorrisponderà solo se si trova alla fine di una riga.grep "kangaroo$" file.txt -
Usa il
.simbolo (punto) per abbinare qualsiasi singolo carattere. Ad esempio, per abbinare tutto ciò che inizia conkanquindi ha due caratteri e termina con la stringaroo, potresti usare il seguente schema:grep "kan..roo" file.txt -
Usa
[ ](parentesi) per far corrispondere ogni singolo carattere racchiuso tra parentesi. Ad esempio, trova le righe che contengonoaccepto “accent, potresti usare il seguente schema:grep "acce[np]t" file.txt -
Usa
[^ ]per abbinare ogni singolo carattere non racchiuso tra parentesi. Il seguente modello corrisponderà a qualsiasi combinazione di stringhe contenenteco(any_letter_except_l)a, comecoca,cobalte così via, ma non corrisponderà alle righe contenenticola,grep "co[^l]a" file.txt
Per sfuggire al significato speciale del carattere successivo, usa il \ simbolo (barra rovesciata).
Espressioni regolari estese #
Per interpretare il modello come un'espressione regolare estesa, usa -E ( o --extended-regexp ) opzione. Le espressioni regolari estese includono tutti i metacaratteri di base, insieme a metacaratteri aggiuntivi per creare modelli di ricerca più complessi e potenti. Di seguito sono riportati alcuni esempi:
-
Abbina ed estrai tutti gli indirizzi email da un determinato file:
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt -
Abbina ed estrai tutti gli indirizzi IP validi da un determinato file:
grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt
Il -o l'opzione viene utilizzata per stampare solo la stringa corrispondente.
Cerca stringhe multiple (modelli) #
È possibile unire due o più modelli di ricerca utilizzando l'operatore OR | .
Per impostazione predefinita, grep interpreta il modello come un'espressione regolare di base in cui i metacaratteri come | perdono il loro significato speciale e devono essere utilizzate le loro versioni con barra rovesciata.
Nell'esempio seguente stiamo cercando tutte le occorrenze delle parole fatal , error e critical nel file loggerror di Nginx:
grep 'fatal\|error\|critical' /var/log/nginx/error.log
Se utilizzi l'opzione di espressione regolare estesa -E , quindi l'operatore | non deve essere evitato, come mostrato di seguito:
grep -E 'fatal|error|critical' /var/log/nginx/error.log Stampa righe prima di una partita #
Per stampare un numero specifico di righe prima di abbinare le righe, usa il -B ( o --before-context ) opzione.
Ad esempio, per visualizzare cinque righe di contesto iniziale prima delle righe corrispondenti, utilizzare il comando seguente:
grep -B 5 root /etc/passwd Stampa righe dopo una partita #
Per stampare un numero specifico di righe dopo aver abbinato le righe, usa il -A ( o --after-context ) opzione.
Ad esempio, per visualizzare cinque righe di contesto finale dopo la corrispondenza delle righe, utilizzare il comando seguente:
grep -A 5 root /etc/passwd Conclusione #
Il grep Il comando consente di cercare un modello all'interno dei file. Se viene trovata una corrispondenza, grep stampa le righe contenenti il modello specificato.
C'è molto altro da sapere su Grep nella pagina del manuale dell'utente di Grep.
Se hai domande o feedback, sentiti libero di lasciare un commento.