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 expression
grep -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 stringakangaroo
corrisponderà 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 stringakangaroo
corrisponderà 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 conkan
quindi 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 contengonoaccept
o “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
,cobalt
e 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.