Ricerca nel sito web

Come utilizzare Awk e le espressioni regolari per filtrare testo o stringhe nei file


Quando eseguiamo determinati comandi in Unix/Linux per leggere o modificare testo da una stringa o un file, la maggior parte delle volte proviamo a filtrare l'output in una determinata sezione di interesse. È qui che l'uso delle espressioni regolari torna utile.

Leggi anche: 10 utili operatori di concatenamento Linux con esempi pratici

Cosa sono le espressioni regolari?

Un'espressione regolare può essere definita come una stringa che rappresenta diverse sequenze di caratteri. Una delle cose più importanti delle espressioni regolari è che ti permettono di filtrare l'output di un comando o di un file, modificare una sezione di un file di testo o di configurazione e così via.

Caratteristiche dell'espressione regolare

Le espressioni regolari sono composte da:

  1. Caratteri comuni come spazio, carattere di sottolineatura(_), A-Z, a-z, 0-9.
  2. Meta caratteri che vengono espansi in caratteri normali, includono:

    1. (.) corrisponde a qualsiasi singolo carattere tranne il ritorno a capo.
    2. (*) corrisponde a zero o più esistenze del carattere immediato che lo precede.
    3. [ carattere(i) ] corrisponde a uno qualsiasi dei caratteri specificati in carattere(i), è anche possibile utilizzare un trattino (-) per indicare un intervallo di caratteri come come [a-f], [1-5] e così via.
    4. ^ corrisponde all'inizio di una riga in un file.
    5. $ corrisponde alla fine della riga in un file.
    6. \ è un carattere di escape.

Per filtrare il testo, è necessario utilizzare uno strumento di filtraggio del testo come awk. Puoi pensare a awk come a un linguaggio di programmazione a sé stante. Ma per lo scopo di questa guida all'uso di awk, lo tratteremo come un semplice strumento di filtraggio della riga di comando.

La sintassi generale di awk è:

awk 'script' filename

Dove 'script' è un insieme di comandi compresi da awk e eseguiti sul file, nomefile.

Funziona leggendo una determinata riga nel file, crea una copia della riga e quindi esegue lo script sulla riga. Questo viene ripetuto su tutte le righe del file.

Lo 'script' è nella forma '/pattern/ action' dove pattern è un'espressione regolare e l'azione è ciò che farà awk quando troverà il modello specificato in una riga.

Come utilizzare lo strumento di filtraggio Awk in Linux

Negli esempi seguenti, ci concentreremo sui metacaratteri di cui abbiamo discusso sopra sotto le caratteristiche di awk.

Un semplice esempio di utilizzo di awk:

L'esempio seguente stampa tutte le righe nel file /etc/hosts poiché non viene fornito alcun modello.

awk '//{print}'/etc/hosts

Usa Awk con Pattern:

Nell'esempio seguente è stato fornito un modello localhost, quindi awk corrisponderà alla riga che ha localhost nel file /etc/hosts.

awk '/localhost/{print}' /etc/hosts 

Usare Awk con il carattere jolly (.) in un Pattern

Il (.) corrisponderà alle stringhe contenenti loc, localhost, localnet nell'esempio seguente.

Vale a dire * l un_singolo_carattere c *.

awk '/l.c/{print}' /etc/hosts

Utilizzo di Awk con il carattere (*) in un pattern

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 riesce a rilevare.

Consideriamo un caso che lo dimostra, prendiamo l'espressione regolare t*t che significa corrispondere a stringhe che iniziano con la lettera t e finiscono con t nella riga sottostante:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint. 

Otterrai le seguenti possibilità quando usi il pattern /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 il carattere jolly (*) nel carattere jolly /t*t/ consente awk di scegliere l'ultima opzione:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint

Usando Awk con set [carattere(i)]

Prendiamo 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 

Specifica dei caratteri in un intervallo

Comprendi i caratteri con awk:

  1. [0-9] indica un singolo numero
  2. [a-z] significa che corrisponde a una singola lettera minuscola
  3. [A-Z] significa che corrisponde a una singola lettera maiuscola
  4. [a-zA-Z] significa che corrisponde a una singola lettera
  5. [a-zA-Z 0-9] significa che corrisponde a una singola lettera o numero

Diamo un'occhiata ad un esempio qui sotto:

awk '/[0-9]/{print}' /etc/hosts 

Tutta la riga del file /etc/hosts contiene almeno un singolo numero [0-9] nell'esempio sopra.

Usa Awk con (^) Meta carattere

Corrisponde a tutte le righe che iniziano con il modello fornito come nell'esempio seguente:

awk '/^fe/{print}' /etc/hosts
awk '/^ff/{print}' /etc/hosts

Usa Awk con il metacarattere ($).

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

Usa Awk con (\) Carattere Escape

Permette di prendere alla lettera il carattere che lo segue, cioè di considerarlo così com'è.

Nell'esempio seguente, il primo comando stampa tutte le righe del file, il secondo comando non stampa nulla perché voglio far corrispondere 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

Ma non è tutto con lo strumento di filtraggio della riga di comando awk: gli esempi sopra riportati illustrano le operazioni di base di awk. Nelle parti successive avanzeremo su come utilizzare le funzionalità complesse di awk. Grazie per la lettura e per eventuali aggiunte o chiarimenti, posta un commento nella sezione commenti.