Il comando AWK è uno strumento potente e versatile per l'elaborazione e la trasformazione dei dati di testo su Linux. Che si tratti di estrarre informazioni, filtrare righe, riformattare l'output o eseguire calcoli, AWK può semplificarti la vita con solo poche righe di codice. In questo articolo imparerai come utilizzare il comando AWK per la manipolazione del testo in Linux.
Cos'è il comando AWK?
Il comando AWK è un linguaggio di programmazione interpretato che viene eseguito nel terminale Linux. Il suo nome deriva dalle iniziali dei suoi creatori: Alfred Aho, Peter Weinberger e Brian Kernighan. AWK è stato originariamente progettato per elaborare file strutturati in campi separati da delimitatori, come file CSV o file /etc/passwd. Ma AWK può gestire anche file di testo più complessi, come file HTML o XML. AWK non è un linguaggio di programmazione orientato agli oggetti , ma consente di definire funzioni e variabili locali o globali. Ha anche strutture di controllo come loop e condizioni.
La sintassi generale del comando AWK è la seguente:
awk [opzioni] 'programma' [file]
Il programma
è una serie di istruzioni che definiscono i modelli da cercare in ogni riga dei file
e le azioni da eseguire quando viene trovato un modello. Le opzioni
ti consentono di modificare il comportamento del comando AWK, come la scelta del delimitatore di campo o il formato di output.
Come stampare il testo con il comando AWK?
Il comando AWK può essere utilizzato per stampare un messaggio sul terminale in base a uno schema nel testo. Se esegui il comando AWK senza motivo e solo un comando print, AWK stampa il messaggio ogni volta che premi Invio.
Ad esempio, se digiti:
awk '{stampa "Ciao"}'
E premi Invio più volte, ottieni:
Buongiorno, buongiorno, buongiorno
Per interrompere il comando AWK, puoi premere Ctrl+C.
Se vuoi stampare il contenuto di un file con il comando AWK, puoi usare il BEGIN
, che viene eseguito prima di leggere il file, e il END
, che viene eseguito dopo la lettura del file. Ad esempio, se hai 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 con il seguente comando:
awk 'BEGIN {print "Ecco il contenuto del file test.txt:"} {print} END {print "Fine del file"}' test.txt
Che danno:
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. Puoi anche stampare un campo specifico utilizzando la $n
, dove n
è il numero del campo. Per impostazione predefinita, i campi sono separati da spazi o tabulazioni, ma puoi modificare il delimitatore con l' -F
.
Ad esempio, se desideri stampare il primo e il terzo campo del /etc/passwd
, separati da due punti ( :)
, puoi utilizzare il seguente comando:
awk -F: '{stampa $1 " " $3}' /etc/passwd
Che dà qualcosa come:
root 0 demone 1 bin 2 sys 3 sync 4 giochi 5 man 6 lp 7 mail 8 news 9 uucp 10 proxy 13 www-data 33 ...
Puoi anche stampare espressioni aritmetiche o stringhe di caratteri con il comando AWK. Ad esempio, se vuoi stampare il quadrato del secondo campo del test.txt
, puoi utilizzare il seguente comando:
awk '{stampa $2^2}' test.txt
Che danno:
sono le 16
Se vuoi stampare il numero di righe nel test.txt
, puoi utilizzare la variabile speciale NR
, che contiene il numero della riga corrente. Ad esempio, puoi utilizzare il seguente comando:
awk 'END {print NR}' test.txt
Che danno:
3
Come filtrare il testo con il comando AWK?
Il comando AWK può essere utilizzato per filtrare il testo in base a modelli o condizioni. Se specifichi un modello prima di un'azione, AWK esegue l'azione solo se il modello viene trovato nella riga. Il modello può essere un'espressione regolare, un confronto, un'operazione logica o una combinazione di questi.
Ad esempio, se desideri stampare le righe del test.txt
che contengono la parola Linux
, puoi utilizzare il seguente comando:
awk '/Linux/ {stampa}' test.txt
Che danno:
Linux è il miglior sistema operativo
Se vuoi stampare le righe del /etc/passwd
che hanno un UID maggiore di 1000, puoi usare il seguente comando:
awk -F: '$3 > 1000 {stampa}' /etc/passwd
Che dà qualcosa come:
systemd-coredump:x:997:997:systemd Core Dumper:/:/usr/sbin/nologin tss:x:131:142:TPM software stack,,,:/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::/inesistente:/bin/false snap_daemon:x:584788:584788::/inesistente:/bin/false ...
È inoltre possibile utilizzare gli operatori logici &&
(e), ||
(o) e !
(no) per combinare modelli. Ad esempio, se desideri stampare righe dal /etc/passwd
che hanno un UID maggiore di 1000 e una shell diversa da /usr/sbin/nologin
, puoi utilizzare il seguente comando:
awk -F: '$3 > 1000 && $7 != "/usr/sbin/nologin" {print}' /etc/passwd
Copiare
Che dà qualcosa come:
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::/inesistente:/bin/false snap_daemon:x:584788:584788::/inesistente:/bin/false ...
Come modificare il testo con il comando AWK?
Il comando AWK può essere utilizzato per modificare il testo utilizzando funzioni integrate o variabili speciali. Ad esempio, se desideri sostituire gli spazi con trattini nel test.txt
, puoi utilizzare la gsub
, che sostituisce tutte le occorrenze di una stringa con un'altra. Puoi anche utilizzare la variabile speciale OFS
, che definisce il separatore del campo di output. Ad esempio, puoi utilizzare il seguente comando:
awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}' test.txt
Che danno:
30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51
Puoi consultare il manuale dei comandi AWK per altre funzioni e variabili disponibili.
Come utilizzare il ciclo for con il comando AWK?
Il comando AWK può essere utilizzato per eseguire cicli for su campi o righe in un file. La sintassi del ciclo for è la seguente:
for (variabile nell'array) azione
Dove variabile
è il nome della variabile che successivamente prende i valori dall'array ,
e azione
è l'azione da eseguire in ogni iterazione.
Ad esempio, se vuoi stampare i campi di un file in ordine inverso, puoi utilizzare il ciclo for con la variabile speciale NF
, che contiene il numero di campi nella riga corrente. Ad esempio, se hai un test.txt
che contiene:
Questo è un test AWK è un ottimo strumento Linux è il miglior sistema operativo
Puoi invertire l'ordine dei campi con il seguente comando:
awk '{for (i=NF; i>0; i--) print $i}' test.txt
Che danno:
il primo test è questo fantastico strumento, il primo è il sistema operativo AWK, il migliore è Linux
Puoi anche utilizzare il ciclo for per scorrere le righe di un file con la variabile speciale FNR
, che contiene il numero di riga relativo al file corrente. Ad esempio, se desideri stampare i numeri di riga pari del test.txt
, puoi utilizzare il seguente comando:
awk 'FNR%2==0 {stampa FNR}' test.txt
Che danno:
2
4
Come eseguire uno script AWK?
estensione .awk
e concedergli i diritti di esecuzione con il chmod +x
. Quindi puoi eseguire lo script con il comando ./script_name.awk [files]
.
Ad esempio, se hai uno script chiamato hello.awk
che contiene:
#!/usr/bin/awk -f BEGIN {print "Ciao"}
È possibile eseguire lo script con il seguente comando:
./ciao.awk
Che danno:
Buongiorno
Come passare argomenti a uno script AWK?
Per passare argomenti a uno script AWK, puoi utilizzare due metodi:
- Il primo metodo consiste nell'utilizzare l'
-v
con ilvariable=value
. Ad esempio, se desideri passare due argomenti denominativar1
evar2
allohello.awk
, puoi utilizzare il seguente comando:
awk -v var1=ciao -v var2=mondo -f ciao.awk
E nel tuo hello.awk
puoi accedere agli argomenti con le variabili $var1
e $var2
. Ad esempio, se il tuo script contiene:
#!/usr/bin/awk -f BEGIN {print $var1 " " $var2}
Ottieni:
Bonjour Monde
- Il secondo metodo consiste nell'utilizzare lo speciale
ARGV
, che contiene gli argomenti passati allo script. Ad esempio, se vuoi passare due argomenti senza nome al tuohello.awk
, puoi utilizzare il seguente comando:
awk -f ciao.awk ciao mondo
E nel tuo hello.awk
gli indici ARGV[1]
e ARGV[2]
. Ad esempio, se il tuo script contiene:
#!/usr/bin/awk -f BEGIN {stampa ARGV[1] " " ARGV[2]}
Ottieni:
Bonjour Monde
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 eseguire il debug di uno script AWK?
Per eseguire il debug di uno script AWK, puoi utilizzare l' -W
parametro lint
, che visualizza messaggi di avviso su potenziali errori nello script. Puoi anche utilizzare l' -W
con il dump-variables
, che visualizza i valori delle variabili alla fine dell'esecuzione dello script.
Come utilizzare il comando AWK per ordinare i dati?
Per utilizzare il comando AWK per ordinare i dati, puoi utilizzare il sort
in combinazione con AWK. Ad esempio, se desideri ordinare gli utenti nel /etc/passwd
in base al loro UID, puoi utilizzare il seguente comando:
awk -F: '{stampa $1, $3}' /etc/passwd | sort -n -k2
Combinando AWK con altri comandi (qui sort
), puoi facilmente andare molto oltre nella visualizzazione e nell'organizzazione dei dati.
Come stampare il conteggio delle parole di un file con il comando AWK?
Per stampare il numero di parole in un file con il comando AWK, puoi utilizzare la variabile speciale NF
, che contiene il numero di campi nella riga corrente, e la variabile speciale NR
, che contiene il numero della riga corrente. Utilizzando un ciclo for, puoi contare il numero di parole in ciascuna riga e aggiungerle a una totale
. Utilizzando il modello speciale END
è possibile stampare il risultato finale. Ad esempio, se hai un file denominato test.txt
che contiene:
Questo è un test AWK è un ottimo strumento Linux è il miglior sistema operativo
È possibile stampare il conteggio delle parole del file con il seguente comando:
awk '{for (i=1; i<=NF; i++) totale++} END {stampa totale}' test.txt
Che danno:
9
Come utilizzare il comando AWK per estrarre dati da un file CSV?
Per utilizzare il comando AWK per estrarre i dati da un file con valori separati da virgole (CSV), è possibile utilizzare l' -F
per impostare il separatore di campo su una virgola. Ad esempio, se disponi di un file denominato test.csv
che contiene:
nome, nome, età Alice, Dupont, 25 Bob, Martin, 32 Charles, Durand, 28
Puoi estrarre il nome e l'età delle persone con il seguente comando:
awk -F"," '{stampa $1 " " $3}' test.csv
Che danno:
nome età Alice 25 Bob 32 Charles 28
Come filtrare i dati con il comando AWK?
Il comando AWK consente di filtrare i dati in base a modelli, che sono espressioni regolari o condizioni logiche. I modelli vengono posizionati prima delle azioni, separati da parentesi graffe. Ad esempio, se desideri visualizzare le righe nel test.csv
che contengono il nome Alice
, puoi utilizzare il seguente modello:
awk -F"," '/Alice/ {print}' test.csv
Che danno:
Alice,Dupont,25
Se desideri visualizzare le righe nel test.csv
più vecchie di 30 anni, puoi utilizzare il seguente modello:
awk -F"," '$3 > 30 {stampa}' test.csv
Che danno:
Bob, Martin, 32
È possibile combinare più modelli con gli operatori logici &&
(e), ||
(o) e !
(NO). Ad esempio, se desideri visualizzare le righe nel test.csv
che hanno un nome che inizia con C
o un'età inferiore a 10 anni, puoi utilizzare il seguente modello:
awk -F"," '($1 ~ /^C/) || ($3 < 10) {stampa}' test.csv
Che danno:
CAMILLE,M,7 CLARA,F,11 CLEMENTE,M,7
Come calcolare le statistiche con il comando AWK?
Il comando AWK consente di calcolare statistiche sui dati numerici in un file, come somma, media, minimo o massimo. Per fare ciò, utilizza semplicemente le variabili per memorizzare i valori intermedi e aggiornarli su ogni riga. Utilizzando lo speciale END
, possiamo visualizzare il risultato finale. Se ad esempio vuoi calcolare la somma e la media delle età presenti nel test.csv
, puoi utilizzare il seguente programma:
awk -F"," 'NR>1 {somma+=$3; conteggio++} END {print "Somma: " somma; print 'Media: 'somma/conteggio}' test.csv
Che danno:
Somma: 110 Media: 18.3333
Spiegazioni:
- Usiamo l'
-F","
per definire il separatore di campo come una virgola. - Usiamo la condizione
NR>1
per ignorare la prima riga del file, che contiene i nomi delle colonne. - Usiamo la
somma
edi conteggio
per accumulare la somma e il numero di età. Usiamo l'+=
per incrementare le variabili con il valore del terzo campo ($3
). - Usiamo il
END
per visualizzare il risultato finale. Usiamo l'/
per calcolare la media dividendo la somma per il numero.
Allo stesso modo, se vuoi calcolare l'età minima e massima del test.csv
, puoi utilizzare il seguente programma:
awk -F"," 'NR>1 {if (min=="") min=max=$3; se ($3 massimo) massimo=$3} END {print "Min: " min; print 'Max: 'max}' test.csv
Che danno:
Minimo: 6 Massimo: 32
Spiegazioni:
- Usiamo l'
-F","
per definire il separatore di campo come una virgola. - Usiamo la condizione
NR>1
per ignorare la prima riga del file, che contiene i nomi delle colonne. - Utilizziamo le
min
emax
per memorizzare le età minima e massima. Inizializziamo queste variabili con il valore del terzo campo ($3
) se sono vuote (""
) . Usiamo gli<
e>
per confrontare valori e aggiornare le variabili se necessario. - Usiamo il
END
per visualizzare il risultato finale.
Conclusione
Il comando AWK è uno strumento essenziale per manipolare i testi sotto Linux. Ti consente di eseguire attività complesse in poche righe di codice, come estrarre, filtrare, modificare o calcolare dati. Offre una grande flessibilità grazie ai suoi modelli, azioni, funzioni e variabili. Può essere combinato con altri comandi Linux per espandere le sue possibilità. Ad esempio, puoi utilizzare il comando Echo su Windows per visualizzare un messaggio o una variabile sullo schermo. Se vuoi saperne di più sul comando AWK puoi consultare il manuale o i tanti tutorial disponibili su Internet.