Quando eseguiamo certain comandi in Linux per leggere o modificare il testo da una stringa o da un file, spesso cerchiamo di filtrare l’output per una sezione specifica di interesse. È qui che l’utilizzo delle espressioni regolari risulta utile.
Cosa sono le espressioni regolari?
A regular expression can be defined as strings that represent several sequences of characters. One of the most important things about regular expressions is that they allow you to filter the output of a command or file, edit a section of a text or configuration file, and so on.
Caratteristiche delle espressioni regolari
Le espressioni regolari sono composte da:
- Caratteri ordinari come spazio, underscore (_), A-Z, a-z, 0-9.
- Meta-caratteri che vengono espansi in caratteri ordinari, includono:
(.)
corrisponde a qualsiasi singolo carattere tranne un ritorno a capo.(*)
corrisponde a zero o più occorrenze del carattere immediatamente precedente ad esso.[ carattere(i) ]
corrisponde a uno qualsiasi dei caratteri specificati in carattere(i), è possibile utilizzare anche un trattino(-)
per indicare un intervallo di caratteri come[a-f]
,[1-5]
, e così via.^
corrisponde all’inizio di una riga in un file.$
corrisponde alla fine della riga in un file.\
è un carattere di escape.
Per filtrare il testo, è necessario utilizzare uno strumento di filtraggio del testo come awk. Si può pensare a awk come un linguaggio di programmazione a sé stante. Ma per quanto riguarda questa guida sull’uso di awk, lo affronteremo come un semplice strumento di filtraggio da riga di comando.
La sintassi generale di awk è:
awk 'script' filename
Dove 'script'
è un insieme di comandi compresi da awk e vengono eseguiti su un file, il nome del file.
Funziona leggendo una data riga nel file, facendo una copia della riga e quindi eseguendo lo script sulla riga. Questo viene ripetuto su tutte le righe nel file.
Lo 'script'
è nella forma '/pattern/ azione'
dove il pattern è un’espressione regolare e l’azione è ciò che awk farà quando trova il pattern dato in una riga.
Come Usare lo Strumento di Filtraggio Awk in Linux
Nei seguenti esempi, ci concentreremo sui meta-caratteri di cui abbiamo discusso sopra sotto le funzionalità di awk.
Stampa Tutte le Righe dal File Usando Awk
L’esempio seguente stampa tutte le righe nel file /etc/hosts poiché non è stato fornito alcun pattern.
awk '//{print}'/etc/hosts

Usa i Pattern di Awk: Corrispondenza delle Righe con ‘localhost’ nel File
Nell’esempio seguente, è stato fornito il modello localhost
, quindi awk corrisponderà alla riga contenente localhost nel file /etc/hosts
.
awk '/localhost/{print}' /etc/hosts

Utilizzare Awk con il jolly (.) in un modello
Il (.)
corrisponderà a stringhe contenenti loc, localhost, localnet nell’esempio seguente.
Cioè * l some_single_character c *.
awk '/l.c/{print}' /etc/hosts

Utilizzare Awk con il carattere (*) in un modello
Corrisponderà a stringhe contenenti localhost, localnet, lines, capable, come nell’esempio seguente:
awk '/l*c/{print}' /etc/localhost

Ti renderai anche conto che (*)
cerca di ottenere la corrispondenza più lunga possibile che può rilevare.
Osserviamo un caso che lo dimostra, prendi l’espressione regolare t*t
che significa corrispondere a stringhe che iniziano con la lettera t
e terminano con t
nella riga seguente:
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint.
Otterrai le seguenti possibilità quando usi il modello /t*t/
:
this is t this is tecmint this is tecmint, where you get t this is tecmint, where you get the best good t this is tecmint, where you get the best good tutorials, how t this is tecmint, where you get the best good tutorials, how tos, guides, t this is tecmint, where you get the best good tutorials, how tos, guides, tecmint
E (*)
in /t*t/
carattere jolly permette ad awk di scegliere l’ultima opzione:
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint
Utilizzare Awk con l’insieme [ carattere(i) ]
Prendi ad esempio l’insieme [al1]
, qui awk corrisponderà a tutte le stringhe contenenti il carattere a
o l
o 1
in una riga nel file /etc/hosts.
awk '/[al1]/{print}' /etc/hosts

L’esempio successivo corrisponde a stringhe che iniziano con K
o k
seguite da T
:
# awk '/[Kk]T/{print}' /etc/hosts

Specificare Caratteri in un Intervallo
Comprendere i caratteri con awk:
[0-9]
significa un singolo numero[a-z]
significa corrispondere a una singola lettera minuscola[A-Z]
significa corrispondere a una singola lettera maiuscola[a-zA-Z]
significa corrispondere a una singola lettera[a-zA-Z 0-9]
significa corrispondere a una singola lettera o numero
Vediamo un esempio sotto:
awk '/[0-9]/{print}' /etc/hosts

Tutte le righe dal file /etc/hosts contengono almeno un singolo numero [0-9]
nell’esempio sopra.
Usare Awk con il Meta Carattere (^)
Corrisponde a tutte le righe che iniziano con il modello fornito come nell’esempio sotto:
# awk '/^fe/{print}' /etc/hosts # awk '/^ff/{print}' /etc/hosts

Usare Awk con il Meta Carattere ($)
Corrisponde a tutte le righe che terminano con il modello fornito:
awk '/ab$/{print}' /etc/hosts awk '/ost$/{print}' /etc/hosts awk '/rs$/{print}' /etc/hosts

Usare Awk con il Carattere di Escape (\)
Consente di considerare il carattere successivo come un letterale, cioè di considerarlo esattamente come è.
Nell’esempio sotto, il primo comando stampa tutte le righe nel file, e il secondo comando non stampa nulla perché voglio corrispondere a una riga che contiene $25.00, ma non viene utilizzato alcun carattere di escape.
Il terzo comando è corretto poiché è stato utilizzato un carattere di escape per leggere $ così com’è.
awk '//{print}' deals.txt awk '/$25.00/{print}' deals.txt awk '/\$25.00/{print}' deals.txt

Riepilogo
Questo non è tutto con lo strumento di filtraggio della riga di comando awk, gli esempi sopra sono le operazioni di base di awk. Nelle prossime parti, avanzeremo su come utilizzare funzionalità complesse di awk.
Grazie per aver letto e per eventuali aggiunte o chiarimenti, posta un commento nella sezione dei commenti.
Source:
https://www.tecmint.com/use-linux-awk-command-to-filter-text-string-in-files/