Come filtrare testo o stringhe utilizzando Awk ed espressioni regolari – Parte 1

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
Awk Prints All Lines in a File

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 
Awk Print Given Matching Line in a File

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
Use Awk to Print Matching Strings in a File

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
Use Awk to Match Strings in File

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
Use-Awk to Print Matching Character in File

L’esempio successivo corrisponde a stringhe che iniziano con K o k seguite da T:

# awk '/[Kk]T/{print}' /etc/hosts 
Use Awk to Print Matched String in File

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 
Use Awk To Print Matching Numbers in File

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
Use Awk to Print All Matching Lines with Pattern

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
Use Awk to Print Given Pattern String

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
Use Awk with Escape Character
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/