Il comando AWK è uno strumento potente e versatile per l'elaborazione e la trasformazione di dati di testo in Linux. Che si tratti di estrarre informazioni, filtrare righe, riformattare l'output o eseguire calcoli, AWK può semplificare il lavoro con poche righe di codice. In questo articolo, imparerai come utilizzare il comando AWK per la manipolazione del testo in Linux.
Che cos'è il comando AWK?

Il comando AWK è un linguaggio di programmazione interpretato eseguibile nel terminale Linux. Il suo nome deriva dalle iniziali dei suoi creatori: Alfred Aho, Peter Weinberger e Brian Kernighan. AWK è stato originariamente progettato per gestire file strutturati con campi separati da delimitatori, come file CSV o file /etc/passwd. Tuttavia, AWK può manipolare anche file di testo più complessi, come file HTML o XML. AWK non è un linguaggio di programmazione orientato agli oggetti , ma consente la definizione di funzioni e variabili locali e globali. Dispone inoltre di strutture di controllo come cicli e istruzioni condizionali.
La sintassi generale del comando AWK è la seguente:
awk [opzioni] 'programma' [file]
Il programma è una sequenza di istruzioni che definiscono i pattern da ricercare in ogni riga del file e le azioni da eseguire quando viene trovato un pattern. Le opzioni consentono di modificare il comportamento del comando AWK, ad esempio scegliendo il delimitatore di campo o il formato di output.
Come faccio a stampare il testo utilizzando il comando AWK?

Il comando AWK può essere utilizzato per stampare un messaggio sul terminale in base a uno schema nel testo. Se si esegue il comando AWK senza alcun schema e solo con un comando di stampa, AWK stamperà il messaggio ogni volta che si preme Invio.
Ad esempio, se digiti:
awk '{print "Ciao"}'
E se premi Invio più volte, ottieni:
Ciao Ciao Ciao
Per interrompere il comando AWK, puoi premere Ctrl+C.
Se si desidera stampare il contenuto di un file utilizzando il comando AWK, è possibile utilizzare il pattern speciale `BEGIN` , che viene eseguito prima della lettura del file, e il pattern speciale `END` , che viene eseguito dopo la lettura del file. Ad esempio, se si dispone di un file denominato `test.txt` che contiene:
Questo è un test. AWK è un ottimo strumento. Linux è il miglior sistema operativo
È possibile stampare il contenuto del file utilizzando il seguente comando:
awk 'BEGIN {print "Ecco il contenuto del file test.txt:"} {print} END {print "Fine del file"}' test.txt
Che dà:
Ecco il contenuto del file test.txt: Questo è un test. AWK è un ottimo strumento. Linux è il miglior sistema operativo. Fine del file
comando {print} senza argomenti stampa l'intera riga. È anche possibile stampare un campo specifico utilizzando la variabile $n , dove n è il numero del campo. Per impostazione predefinita, i campi sono separati da spazi o tabulazioni, ma è possibile modificare il delimitatore con l' -F .
Ad esempio, se si desidera stampare il primo e il terzo campo del /etc/passwd , separati da due punti ( :) , è possibile utilizzare il seguente comando:
awk -F: '{stampa $1 " " $3}' /etc/passwd
Che dà qualcosa del tipo:
root 0 daemon 1 bin 2 sys 3 sync 4 games 5 man 6 lp 7 mail 8 news 9 uucp 10 proxy 13 www-data 33 ...
È anche possibile stampare espressioni aritmetiche o stringhe utilizzando il comando AWK. Ad esempio, se si desidera stampare il quadrato del secondo campo nel file test.txt , è possibile utilizzare il seguente comando:
awk '{print $2^2}' test.txt
Che dà:
è 16 è
Per visualizzare il numero di righe nel file test.txt , è possibile utilizzare la variabile speciale NR , che contiene il numero di riga corrente. Ad esempio, è possibile utilizzare il seguente comando:
awk 'END {print NR}' test.txt
Che dà:
3
Come filtrare il testo utilizzando il comando AWK?

Il comando AWK può essere utilizzato per filtrare il testo in base a pattern o condizioni. Se si specifica un pattern prima di un'azione, AWK eseguirà l'azione solo se il pattern viene trovato nella riga. Il pattern può essere un'espressione regolare, un confronto, un'operazione logica o una combinazione di questi.
Ad esempio, se si desidera stampare le righe del test.txt che contengono la parola Linux , è possibile utilizzare il seguente comando:
awk '/Linux/ {print}' test.txt
Che dà:
Linux è il miglior sistema operativo
Se si desidera stampare le righe nel /etc/passwd che hanno un UID maggiore di 1000, è possibile utilizzare il seguente comando:
awk -F: '$3 > 1000 {stampa}' /etc/passwd
Che dà qualcosa del tipo:
systemd-coredump:x:997:997:systemd Core Dumper:/:/usr/sbin/nologin tss:x:131:142:stack software TPM,,,:/var/lib/tpm:/bin/false _rpc:x:132:65534::/run/rpcbind:/usr/sbin/nologin statd:x:133:65534::/var/lib/nfs:/usr/sbin/nologin libvirt-qemu:x:64055:139:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin snapd-range-524288-root:x:524288:524288::/nonexistent:/bin/false snap_daemon:x:584788:584788::/nonexistent:/bin/false ...
È anche possibile utilizzare gli operatori logici && (e), || (o) e ! (non) per combinare i pattern. Ad esempio, se si desidera stampare le righe nel /etc/passwd che hanno un UID maggiore di 1000 e una shell diversa da /usr/sbin/nologin , è possibile utilizzare il seguente comando:
awk -F: '$3 > 1000 && $7 != "/usr/sbin/nologin" {print}' /etc/passwd
Copia
Che dà qualcosa del tipo:
tss:x:131:142:stack software TPM,,,:/var/lib/tpm:/bin/false _rpc:x:132:65534::/run/rpcbind:/usr/sbin/nologin statd:x:133:65534::/var/lib/nfs:/usr/sbin/nologin libvirt-qemu:x:64055:139:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin snapd-range-524288-root:x:524288:524288::/nonexistent:/bin/false snap_daemon:x:584788:584788::/nonexistent:/bin/false ...
Come modificare il testo utilizzando il comando AWK?

Il comando AWK può essere utilizzato per modificare il testo utilizzando funzioni integrate o variabili speciali. Ad esempio, se si desidera sostituire gli spazi con i trattini nel file test.txt , è possibile utilizzare la gsub , che sostituisce tutte le occorrenze di una stringa con un'altra. È inoltre possibile utilizzare la OFS , che definisce il separatore dei campi di output. Ad esempio, è possibile utilizzare il seguente comando:
awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}' test.txt
Che dà:
30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51
Per informazioni sulle altre funzioni e variabili disponibili, è possibile consultare il manuale dei comandi AWK.
Come utilizzare il ciclo for con il comando AWK?
Il comando AWK può essere utilizzato per eseguire cicli for sui campi o sulle righe di un file. La sintassi del ciclo for è la seguente:
per (variabile nell'array) azione
Dove variabile è il nome della variabile che successivamente prende i valori dall'array e azione è l'azione da eseguire a ogni iterazione.
Ad esempio, se si desidera stampare i campi di un file in ordine inverso, è possibile utilizzare un ciclo for con la variabile speciale NF , che contiene il numero di campi nella riga corrente. Ad esempio, se si dispone di un file denominato test.txt che contiene:
Questo è un test. AWK è un ottimo strumento. Linux è il miglior sistema operativo
È possibile invertire l'ordine dei campi con il seguente comando:
awk '{for (i=NF; i>0; i--) print $i}' test.txt
Che dà:
Un test è questo formidabile strumento; uno è AWK; il miglior sistema operativo è Linux

È anche possibile utilizzare il ciclo for per scorrere le righe di un file con la variabile speciale FNR , che contiene il numero di riga del file corrente. Ad esempio, se si desidera stampare le righe pari del file test.txt , è possibile utilizzare il seguente comando:
awk 'FNR%2==0 {stampa FNR}' test.txt
Che dà:
2
4
Come si esegue uno script AWK?
Per eseguire uno script AWK, puoi inserirlo in un file con .awk e assegnargli i permessi di esecuzione con il comando chmod +x . Quindi, puoi eseguire lo script con il comando ./script_name.awk [files] .
Ad esempio, se hai uno script denominato hello.awk che contiene:
#!/usr/bin/awk -f BEGIN {print "Ciao"}
È possibile eseguire lo script con il seguente comando:
./ciao.awk
Che dà:
Buongiorno
Come posso passare argomenti a uno script AWK?

Per passare argomenti a uno script AWK, puoi utilizzare due metodi:
- Il primo metodo prevede l'utilizzo
-vcon il formatovariabile=valore. Ad esempio, se si desidera passare due argomenti denominativar1evar2allohello.awk, è possibile utilizzare il seguente comando:
awk -v var1=ciao -v var2=mondo -f ciao.awk
E nello hello.awk , puoi accedere agli argomenti utilizzando le variabili $var1 e $var2 . Ad esempio, se lo script contiene:
#!/usr/bin/awk -f BEGIN {print $var1 " " $var2}
Ottieni:
Ciao mondo
- Il secondo metodo prevede l'utilizzo dello speciale
ARGV, che contiene gli argomenti passati allo script. Ad esempio, se si desidera passare due argomenti senza nome allohello.awk, è possibile utilizzare il seguente comando:
awk -f hello.awk hello world
E nello hello.awk , puoi accedere agli argomenti utilizzando gli indici ARGV[1] e ARGV[2] . Ad esempio, se lo script contiene:
#!/usr/bin/awk -f BEGIN {stampa ARGV[1] " " ARGV[2]}
Ottieni:
Ciao mondo
Domande frequenti
Qual è la differenza tra AWK e GAWK?
GAWK è un'implementazione GNU di AWK, che aggiunge funzionalità aggiuntive al linguaggio originale, come il supporto per espressioni regolari estese, array multidimensionali o funzioni predefinite.
Come faccio a eseguire il debug di uno script AWK?
opzione -W con il lint , che visualizza messaggi di avviso su potenziali errori nello script. È inoltre possibile utilizzare l' -W con il dump-variables , che visualizza i valori delle variabili al termine dell'esecuzione dello script.
Come si usa il comando AWK per ordinare i dati?
Per utilizzare il comando AWK per ordinare i dati, è possibile utilizzare il `sort` in combinazione con AWK. Ad esempio, se si desidera ordinare gli utenti nel `/etc/passwd` in base al loro UID, è possibile utilizzare il seguente comando:
awk -F: '{stampa $1, $3}' /etc/passwd | sort -n -k2
Combinando AWK con altri comandi (in questo caso sort ), è possibile ottenere risultati molto più efficaci nella visualizzazione e nell'organizzazione dei dati.
Come faccio a stampare il numero di parole in un file utilizzando il comando AWK?
Per stampare il numero di parole in un file utilizzando il comando AWK, è possibile utilizzare la variabile speciale NF , che contiene il numero di campi nella riga corrente, e la variabile speciale NR , che contiene il numero di riga corrente. Utilizzando un ciclo for, è possibile contare il numero di parole in ogni riga e aggiungerle a una variabile denominata total . Utilizzando il pattern speciale END , è possibile stampare il risultato finale. Ad esempio, se si dispone di un file denominato test.txt che contiene:
Questo è un test. AWK è un ottimo strumento. Linux è il miglior sistema operativo
È possibile stampare il numero di parole nel file utilizzando il seguente comando:
awk '{for (i=1; i<=NF; i++) total++} END {print total}' test.txt
Che dà:
9
Come si usa il comando AWK per estrarre dati da un file CSV?
Per utilizzare il comando AWK per estrarre dati da un file CSV (valori separati da virgola), è possibile utilizzare l' -F per impostare la virgola come separatore di campo. Ad esempio, se si dispone di un file denominato test.csv che contiene:
Nome, cognome, età: Alice Dupont, 25; Bob Martin, 32; Charles Durand, 28
È possibile estrarre il nome e l'età delle persone utilizzando il seguente comando:
awk -F"," '{print $1 " " $3}' test.csv
Che dà:
Nome, età: Alice 25, Bob 32, Charles 28
Come filtrare i dati utilizzando il comando AWK?
Il comando AWK consente di filtrare i dati in base a pattern, ovvero espressioni regolari o condizioni logiche. I pattern vengono posizionati prima delle azioni, separati da parentesi graffe. Ad esempio, se si desidera visualizzare le righe nel file test.csv che contengono il nome Alice , è possibile utilizzare il seguente pattern:
awk -F"," '/Alice/ {stampa}' test.csv
Che dà:
Alice, Dupont, 25
Se si desidera visualizzare le righe nel test.csv che risalgono a più di 30 anni fa, è possibile utilizzare il seguente schema:
awk -F"," '$3 > 30 {print}' test.csv
Che dà:
Bob, Martin, 32
È possibile combinare più pattern utilizzando gli operatori logici && (e), || (o) e ! (non). Ad esempio, se si desidera visualizzare le righe nel file test.csv che hanno un nome che inizia con C o un'età inferiore a 10 anni, è possibile utilizzare il seguente pattern:
awk -F"," '($1 ~ /^C/) || ($3 < 10) {print}' test.csv
Che dà:
CAMILLE, M, 7 CLARA, F, 11 CLEMENT, M, 7
Come calcolare le statistiche utilizzando il comando AWK?
Il comando AWK consente di calcolare statistiche sui dati numerici in un file, come la somma, la media, il minimo o il massimo. Per farlo, è sufficiente utilizzare delle variabili per memorizzare i valori intermedi e aggiornarli a ogni riga. Utilizzando lo speciale END , è possibile visualizzare il risultato finale. Ad esempio, se si desidera calcolare la somma e la media delle età nel file test.csv , è possibile utilizzare il seguente programma:
awk -F"," 'NR>1 {somma+=$3; conteggio++} END {print "Somma: " somma; print 'Media: 'somma/conteggio}' test.csv
Che dà:
Totale: 110 Media: 18.3333
Spiegazione:
-
-F","viene utilizzata per definire il separatore di campo come virgola. - Utilizziamo la condizione
NR>1per ignorare la prima riga del file, che contiene i nomi delle colonne. - Utilizziamo le variabili
sumecountper sommare la somma e il numero di età. Utilizziamo l'operatore+=per incrementare le variabili con il valore del terzo campo ($3). -
ENDviene utilizzato/viene utilizzato per calcolare la media dividendo la somma per il numero.
Allo stesso modo, se si desidera calcolare l'età minima e massima nel test.csv , è possibile utilizzare il seguente programma:
awk -F"," 'NR>1 {se (min=="") min=max=$3; se ($3<min) min=$3; if ($3> max) max=$3} END {print "Min: " min; print 'Max: 'max}' test.csv
Che dà:
Minimo: 6 Massimo: 32
Spiegazione:
-
-F","viene utilizzata per definire il separatore di campo come virgola. - Utilizziamo la condizione
NR>1per ignorare la prima riga del file, che contiene i nomi delle colonne. - Utilizziamo le variabili
minemaxper memorizzare le età minima e massima. Inizializziamo queste variabili con il valore del terzo campo ($3) se sono vuote (""). Utilizziamo gli operatori<e>per confrontare i valori e aggiornare le variabili se necessario. - Per visualizzare il risultato finale il
END
Conclusione
Il comando AWK è uno strumento essenziale per la manipolazione del testo in Linux. Permette di eseguire attività complesse in poche righe di codice, come l'estrazione, il filtraggio, la modifica o il calcolo dei dati. Offre grande flessibilità grazie ai suoi pattern, azioni, funzioni e variabili. Può essere combinato con altri comandi Linux per estenderne le capacità. Ad esempio, è possibile utilizzare il comando Echo su Windows per visualizzare un messaggio o una variabile sullo schermo. Per saperne di più sul comando AWK, è possibile consultare il manuale o i numerosi tutorial disponibili online.


