Come padroneggiare il comando AWK per elaborare i testi sotto Linux?

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 linguaggio di programmazione AWK.svg

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?

Come utilizzare il comando Awk su Linux

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?

dl.beatsnoop.com pollice 1687289446

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?

dl.beatsnoop.com pollice 1687289615

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
dl.beatsnoop.com pollice 1687289757

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?

dl.beatsnoop.com pollice 1687289922

Per passare argomenti a uno script AWK, puoi utilizzare due metodi:

  • Il primo metodo consiste nell'utilizzare l' -v con il variable=value . Ad esempio, se desideri passare due argomenti denominati var1 e var2 allo hello.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 tuo hello.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 e di 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 e max 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.

Articolo precedente Come proteggere i trasferimenti di file con FTPS su Windows Server?
Articolo successivoCome ottenere YouTube Premium gratis?
Ciao a me, sono François :) Editor nel mio tempo libero che ama condividere la sua passione: TT High tech! 😍 Che si tratti di hardware, software, videogiochi, social media e tante altre aree del sito. Condivido con voi le mie analisi, i miei test, i tutorial e i miei preferiti su vari media. Sono un tecnofilo esperto ed esigente, che non si limita a seguire la moda, ma che cerca di guidarti verso le migliori soluzioni. Quindi rimanete sintonizzati!