La magia delle espressioni regolari - 03 grep - per la ricerca nei file di testo #1
Sommario:
- Sintassi del comando Grep
- Come usare
grep
per cercare una stringa nei file - Inverti partita (Escludi)
- Come usare Grep per cercare una stringa nell'output dei comandi
- Ricerca ricorsiva
- Mostra solo il nome file
- Ricerca senza distinzione tra maiuscole e minuscole
- Cerca parole complete
- Mostra numeri di riga
- Conteggio partite
- Cerca più stringhe (pattern)
- Modalità silenziosa
- Espressione regolare di base
- Espressioni regolari estese
- Stampa righe prima di una partita
- Stampa righe dopo una partita
- Conclusione
Il comando
grep
che sta per "stampa di espressioni regolari globali" è uno dei comandi più potenti e comunemente usati in Linux.
Grep cerca uno o più file di input alla ricerca di linee che corrispondono a un determinato modello e scrive ciascuna riga corrispondente sullo standard output. Se non viene specificato alcun file,
grep
legge l'input standard, che di solito è l'output di un altro comando.
In questo tutorial, ti mostreremo come usare il comando
grep
attraverso esempi pratici e spiegazioni dettagliate delle più comuni opzioni
grep
GNU.
Sintassi del comando Grep
Prima di andare su come usare il comando
grep
, iniziamo esaminando la sintassi di base.
Le espressioni di utilità
grep
hanno la seguente forma:
grep PATTERN
Gli elementi tra parentesi quadre sono opzionali.
-
OPTIONS
: zero o più opzioni. Grep offre 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.
Come usare
grep
per cercare una stringa nei file
L'uso più basilare del comando
grep
è la ricerca di una stringa (testo) in un file.
Ad esempio, per visualizzare le righe dal
/etc/passwd
contenente la stringa
bash
è possibile usare il comando seguente:
grep bash /etc/passwd
L'output dovrebbe assomigliare 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 partita (Escludi)
Per visualizzare le linee che non corrispondono a un modello, utilizzare l'opzione
-v
(o
--invert-match
).
Ad esempio per visualizzare le righe dal
/etc/passwd
che non contengono la stringa
nologin
è possibile usare il comando seguente:
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
Come usare Grep per cercare una stringa nell'output dei comandi
Invece di specificare i file di input, è possibile reindirizzare l'output di un altro comando a
grep
, quindi visualizzare solo le righe corrispondenti a un determinato modello.
Ad esempio, per scoprire quali processi sono in esecuzione sul sistema come
www-data
dell'utente
www-data
è possibile utilizzare il seguente comando
ps
:
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ù pipe su comando. Come puoi vedere nell'output sopra c'è anche una riga che contiene il processo
grep
. Se non vuoi che quella linea venga mostrata, passa l'output a un'altra istanza
grep
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 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
Ricerca ricorsiva
Per cercare ricorsivamente uno schema, usa l'opzione
-r
(o
--recursive
). Questo cercherà tra tutti i file nella directory specificata, saltando i collegamenti simbolici che si incontrano in modo ricorsivo. Per seguire tutti i collegamenti simbolici, utilizzare l'opzione
-R
(o
--dereference-recursive
).
Nel seguente esempio stiamo cercando la stringa
linuxize.com
in tutti i file all'interno della directory
/etc
:
grep -r linuxize.com /etc
Il comando stamperà 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 invece
-r
usi l'opzione
-R
grep
seguirà tutti i collegamenti simbolici:
grep -R linuxize.com /etc
Si noti l'ultima riga dell'output. Quella riga non viene stampata nell'esempio precedente perché i file all'interno della directory
sites-enabled
i
sites-enabled
di Nginx sono collegamenti simbolici ai file di configurazione all'interno della directory
sites-available
i
sites-available
.
/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 sopprimere l'output
grep
predefinito e stampare solo i nomi dei file contenenti il modello corrispondente, è possibile utilizzare l'opzione
-l
(o
--files-with-matches
).
Ad esempio, per cercare tutti i file che terminano con
.conf
nella directory di lavoro corrente e stampare solo i nomi dei file contenenti la stringa
linuxize.com
digitare:
grep -l linuxize.com *.conf
L'output sarà simile al seguente:
tmux.conf haproxy.conf
L'opzione
-l
viene solitamente utilizzata in combinazione con l'opzione ricorsiva
-R
:
Ricerca senza distinzione tra maiuscole e minuscole
Per impostazione predefinita, il comando
grep
fa distinzione tra maiuscole e minuscole. Ciò significa che i caratteri maiuscoli e minuscoli sono trattati come distinti.
Per ignorare il caso durante la ricerca, utilizzare l'opzione
-i
(o
--ignore-case
).
Ad esempio, quando si cerca
Zebra
senza alcuna opzione, il comando seguente non mostrerà alcun output, ovvero ci sono linee corrispondenti:
grep Zebra /usr/share/words
Ma se esegui una ricerca senza distinzione tra maiuscole e minuscole utilizzando l'opzione
-i
, corrisponderà alle lettere maiuscole e minuscole:
grep -i Zebra /usr/share/words
Specificare "Zebra" corrisponderà a "zebra", "ZEbrA" o qualsiasi altra combinazione di lettere maiuscole e minuscole per quella stringa.
Cerca parole complete
Durante la ricerca di "gnu",
grep
stamperà anche le righe in cui "gnu" è incorporato in parole più grandi, come "cygnus" o "magnum".
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 parole), utilizzare l'
-w
(o
--word-regexp
).
az
,
AZ
e
0-9
) e caratteri di sottolineatura (
_
). Tutti gli altri caratteri sono considerati caratteri non di parole.
grep -w gnu /usr/share/words
Mostra numeri di riga
Per mostrare il numero delle linee che contengono una stringa che corrisponde a un modello, utilizzare l'opzione
-n
(o
--line-number
). Quando si utilizza questa opzione,
grep
stamperà le corrispondenze sullo standard output prefissato con il numero di riga su cui è stata trovata.
Ad esempio per visualizzare le righe dal
/etc/services
contenente la stringa
bash
con il prefisso con il numero di riga corrispondente è possibile usare il comando seguente:
grep -n 10000 /etc/services
L'output di seguito mostra che le corrispondenze si trovano sulle righe 10423 e 10424.
10423:ndmp 10000/tcp 10424:ndmp 10000/udp
Conteggio partite
Per stampare un conteggio delle righe corrispondenti allo standard output, utilizzare l'
-c
(o
--count
).
Nell'esempio seguente, contiamo il numero di account che hanno
/usr/bin/zsh
come shell.
grep -c '/usr/bin/zsh' /etc/passwd
Cerca più stringhe (pattern)
È possibile unire due o più schemi di ricerca utilizzando l'operatore OR
|
.
Per impostazione predefinita,
grep
interpreta il modello come un'espressione regolare di base in cui i meta-caratteri come
|
perdono il loro significato speciale e devono essere utilizzate le loro versioni rovesciate.
Nell'esempio seguente stiamo cercando tutte le occorrenze delle parole
fatal
,
error
e
critical
nel file di errore del registro di Nginx:
grep 'fatal\|error\|critical' /var/log/nginx/error.log
grep -E 'fatal|error|critical' /var/log/nginx/error.log
Modalità silenziosa
--quiet
(o
--quiet
) dice a
grep
di non scrivere nulla sul terminale (output standard). Se viene trovata una corrispondenza, il comando uscirà con lo stato
0
. Ciò è utile quando si utilizza
grep
negli script di shell in cui si desidera verificare se un file contiene una stringa ed eseguire una determinata azione in base al risultato.
Ecco un esempio dell'uso di
grep
in modalità non interattiva come comando di test in un'istruzione
if
:
if grep -q PATTERN filename then echo pattern found else echo pattern not found fi
Espressione regolare di base
GNU Grep ha due set di funzioni per le espressioni regolari, Basic ed Extended. Per impostazione predefinita,
grep
interpreta il modello come un'espressione regolare di base.
Se utilizzati nella modalità di espressione regolare di base, tutti gli altri caratteri tranne i meta-caratteri sono in realtà espressioni regolari corrispondenti a se stessi. Di seguito è riportato un elenco dei meta-caratteri più comunemente usati:
-
Utilizzare il simbolo
^
(punto di inserimento) per far corrispondere l'espressione all'inizio di una riga. Nell'esempio seguente, la stringa^kangaroo
corrisponderà solo se si verifica all'inizio di una riga.grep "^kangaroo" file.txt
Utilizzare il simbolo
$
(dollaro) per abbinare l'espressione alla fine di una riga. Nel seguente esempio, la stringakangaroo$
corrisponderà solo se si verifica alla fine di una riga.grep "kangaroo$" file.txt
Usa il
.
(punto) simbolo per abbinare qualsiasi singolo carattere. Ad esempio, per abbinare tutto ciò che inizia conkan
ha quindi due caratteri e termina con ilroo
della stringa, è possibile utilizzare il modello seguente:grep "kan..roo" file.txt
Uso
accept
o "accent
, puoi usare il seguente modello:grep "accet" file.txt
Uso
co(any_letter_except_l)a
, comecoca
,cobalt
e così via, ma non corrisponderà alle righe contenenticola
,grep "coa" file.txt
Per sfuggire al significato speciale del personaggio successivo, usa il simbolo
\
(barra rovesciata).
Espressioni regolari estese
Per interpretare il modello come un'espressione regolare estesa, utilizzare l'opzione
-E
(o
--extended-regexp
). Le espressioni regolari estese includono tutti i meta-caratteri di base, insieme a meta-caratteri aggiuntivi per creare schemi 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+@+\.{2, 6}\b" file.txt
Abbina ed estrai tutti gli indirizzi IP validi da un determinato file:
grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt
L'opzione
-o
viene utilizzata per stampare solo la stringa corrispondente.
Stampa righe prima di una partita
Per stampare un numero specifico di righe prima di far corrispondere le righe, utilizzare l'opzione
-B
(o
--before-context
).
Ad esempio, per visualizzare cinque righe di contesto iniziale prima di abbinare le righe, utilizzare il comando seguente:
Stampa righe dopo una partita
Per stampare un numero specifico di righe dopo aver abbinato le righe, utilizzare l'opzione
-A
(o
--after-context
).
Ad esempio, per visualizzare cinque righe di contesto finale dopo aver abbinato le righe, utilizzare il comando seguente:
Conclusione
Il comando
grep
consente di cercare un modello all'interno dei file. Se viene trovata una corrispondenza, grep stamperà le linee contenenti il motivo specificato.
C'è molto altro da sapere su Grep nella pagina del Manuale dell'utente di Grep.
terminale grepEtichetta di messaggistica di testo: testo o non testo
"Messaggio di testo non in chiesa" e altri preferiti ...
Trova informazioni nei file di testo File di indice Cerca parole Lite
Parole di ricerca di file di indice Lite è come il tuo Google ... per molti file di testo sono sul tuo hard disk.
Trova e sostituisci testo in più file in blocco su Windows
Trova e sostituisci strumento ti aiuterà a trovare e sostituire il testo in più file alla rinfusa. Basta inserire il testo e premere Sostituisci per sostituire il testo all`istante.