Le espressioni regolari vengono utilizzate per cercare e manipolare il testo, in base ai modelli. La maggior parte dei comandi e dei linguaggi di programmazione di Linux utilizza l'espressione regolare.
Il comando Grep viene utilizzato per cercare una stringa specifica in un file. Si prega di fare riferimento al nostro articolo precedente per 15 esempi pratici di comandi grep.
Puoi anche usare le espressioni regolari con il comando grep quando vuoi cercare un testo contenente un modello particolare. Le espressioni regolari cercano i modelli su ciascuna riga del file. Semplifica la nostra operazione di ricerca.
Questo articolo fa parte di una serie di 2 articoli.
Questo articolo della parte 1 copre esempi di grep per semplici espressioni regolari. Il futuro articolo della parte 2 tratterà esempi avanzati di espressioni regolari in grep.
Prendiamo il file /var/log/messages che verrà utilizzato nei nostri esempi.
Esempio 1. Inizio riga ( ^ )
Nel comando grep, il simbolo caret ^ corrisponde all'espressione all'inizio di una riga. Nell'esempio seguente, mostra tutta la riga che inizia con il 10 novembre, ovvero tutti i messaggi registrati il 10 novembre.
$ grep "^Nov 10" messages.1 Nov 10 01:12:55 gs123 ntpd[2241]: time reset +0.177479 s Nov 10 01:17:17 gs123 ntpd[2241]: synchronized to LOCAL(0), stratum 10 Nov 10 01:18:49 gs123 ntpd[2241]: synchronized to 15.1.13.13, stratum 3 Nov 10 13:21:26 gs123 ntpd[2241]: time reset +0.146664 s Nov 10 13:25:46 gs123 ntpd[2241]: synchronized to LOCAL(0), stratum 10 Nov 10 13:26:27 gs123 ntpd[2241]: synchronized to 15.1.13.13, stratum 3
Il ^ corrisponde all'espressione all'inizio di una riga, solo se è il primo carattere in un'espressione regolare. ^N corrisponde alla riga che inizia con N.
Esempio 2. Fine della riga ( $)
Il carattere $ corrisponde all'espressione alla fine di una riga. Il comando seguente ti aiuterà a ottenere tutte le righe che terminano con la parola "terminating".
$ grep "terminating.$" messages Jul 12 17:01:09 cloneme kernel: Kernel log daemon terminating. Oct 28 06:29:54 cloneme kernel: Kernel log daemon terminating.
Dall'output sopra puoi venire a sapere quando tutto il log del kernel è stato terminato. Proprio come ^ corrisponde all'inizio della riga solo se è il primo carattere, $ corrisponde alla fine della riga solo se è l'ultimo carattere in un'espressione regolare.
Esempio 3. Conteggio di righe vuote ( ^$ )
Usando ^ e $ caratteri puoi scoprire le righe vuote disponibili in un file. “^$” specifica una riga vuota.
$ grep -c "^$" messages anaconda.log messages:0 anaconda.log:3
I comandi precedenti mostrano il conteggio delle righe vuote disponibili nei messaggi e nei file anaconda.log.
Esempio 4. Carattere singolo (.)
Il metacarattere speciale "." (punto) corrisponde a qualsiasi carattere tranne il carattere di fine riga. Prendiamo il file di input che ha il contenuto come segue.
$ cat input 1. first line 2. hi hello 3. hi zello how are you 4. cello 5. aello 6. eello 7. last line
Cerchiamo ora una parola che abbia un qualsiasi carattere seguito da ello. cioè ciao, violoncello ecc.,
$ grep ".ello" input 2. hi hello 3. hi zello how are you 4. cello 5. aello 6. eello
Se vuoi cercare una parola che ha solo 4 caratteri puoi dare grep -w “….” dove un punto singolo rappresenta un singolo carattere.
Esempio 5. Zero o più occorrenze (*)
Il carattere speciale “*” corrisponde a zero o più occorrenze del carattere precedente. Ad esempio, il modello "1*" corrisponde a zero o più "1".
L'esempio seguente cerca un modello "kernel:*", ovvero kernel:e zero o più occorrenze di spazi.
$ grep "kernel: *." * messages.4:Jul 12 17:01:02 cloneme kernel: ACPI: PCI interrupt for device 0000:00:11.0 disabled messages.4:Oct 28 06:29:49 cloneme kernel: ACPI: PM-Timer IO Port: 0x1008 messages.4:Oct 28 06:31:06 btovm871 kernel: sda: sda1 sda2 sda3 messages.4:Oct 28 06:31:06 btovm871 kernel: sd 0:0:0:0: Attached scsi disk sda . .
Nell'esempio precedente corrisponde al simbolo del kernel e dei due punti seguiti da un numero qualsiasi di spazi/nessuno spazio e "." corrisponde a qualsiasi singolo carattere.
Esempio 6. Una o più occorrenze (\+)
Il carattere speciale “\+” corrisponde a una o più occorrenze del carattere precedente. ” \+” corrisponde ad almeno uno o più spazi.
Se non c'è spazio, non corrisponderà. Il carattere "+" rientra nell'espressione regolare estesa. Quindi devi scappare quando vuoi usarlo con il comando grep.
$ cat input hi hello hi hello how are you hihello $ grep "hi \+hello" input hi hello hi hello how are you
Nell'esempio sopra, il pattern grep corrisponde al pattern 'hi', seguito da uno o più spazi, seguito da "hello".
Se non c'è spazio tra ciao e ciao, non corrisponderà a quello. Tuttavia, il carattere * corrisponde a zero o più occorrenze.
"ciao" sarà abbinato a * come mostrato di seguito.
$ grep "hi *hello" input hi hello hi hello how are you hihello $
Esempio 7. Zero o una occorrenza (\?)
Il carattere speciale "?" corrisponde a zero o a una occorrenza del carattere precedente. "0?" corrisponde a zero o niente.
$ grep "hi \?hello" input hi hello hihello
"ciao \?ciao" corrisponde a ciao e ciao con uno spazio singolo (ciao ciao) e nessuno spazio (ciao).
La riga che ha più di uno spazio tra ciao e ciao non è stata abbinata nel comando precedente.
Esempio 8.Escape del carattere speciale (\)
Se vuoi cercare caratteri speciali (ad esempio:* , punto) nel contenuto devi evitare il carattere speciale nell'espressione regolare.
$ grep "127\.0\.0\.1" /var/log/messages.4 Oct 28 06:31:10 btovm871 ntpd[2241]: Listening on interface lo, 127.0.0.1#123 Enabled
Esempio 9. Classe di caratteri ([0-9])
La classe di caratteri non è altro che un elenco di caratteri menzionati tra parentesi quadre che viene utilizzata per trovare una corrispondenza solo tra diversi caratteri.
$ grep -B 1 "[0123456789]\+ times" /var/log/messages.4 Oct 28 06:38:35 btovm871 init: open(/dev/pts/0): No such file or directory Oct 28 06:38:35 btovm871 last message repeated 2 times Oct 28 06:38:38 btovm871 pcscd: winscard.c:304:SCardConnect() Reader E-Gate 0 0 Not Found Oct 28 06:38:38 btovm871 last message repeated 3 times
I messaggi ripetuti verranno registrati nel file di registro dei messaggi come "ultimo messaggio ripetuto n volte". L'esempio precedente cerca la riga che ha un numero qualsiasi (da 0 a 9) seguito dalla parola "volte". Se corrisponde, mostra la riga prima della riga abbinata e anche la riga abbinata.
Con tra parentesi quadre, utilizzando il trattino è possibile specificare l'intervallo di caratteri. Come [0123456789] può essere rappresentato da [0-9]. È anche possibile specificare l'intervallo di alfabeti come [a-z], [A-Z] ecc. Quindi il comando sopra può anche essere scritto come
$ grep -B 1 "[0-9]\+ times" /var/log/messages.4
Esempio 10. Eccezione nella classe di caratteri
Se vuoi cercare tutti i caratteri tranne quelli tra parentesi quadre, usa il simbolo ^ (Caret) come primo carattere dopo la parentesi quadra aperta. L'esempio seguente cerca una riga che non inizia con la lettera vocale dal file di parole del dizionario in Linux.
$ grep -i "^[^aeiou]" /usr/share/dict/linux.words 1080 10-point 10th 11-point 12-point 16-point 18-point 1st 2
Il primo simbolo di accento circonflesso nell'espressione regolare rappresenta l'inizio della riga. Tuttavia, il simbolo dell'accento circonflesso all'interno della parentesi quadra rappresenta "tranne", ovvero corrisponde a tutte le parentesi nella parentesi quadra.