GNU/Linux >> Linux Esercitazione >  >> Linux

Espressioni regolari nel comando Grep con 10 esempi - Parte I

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.


Linux
  1. Comando wc Linux con esempi

  2. Comando Nohup con esempi

  3. Comando JQ in Linux con esempi

  4. Espressioni regolari avanzate nel comando Grep con 10 esempi - Parte II

  5. Come si usano le espressioni regolari con il comando cp in Linux?

15 Comando Linux ps con esempi

Utilizzo del comando GREP in Linux con esempi

Il tutorial sul comando Grep con esempi per principianti

Comando della cronologia con esempi

Comando Grep in Linux (con esempi)

10 esempi pratici di regex con grep