Ricerca nel sito web

40 Comando awk pratico e utile in Linux e BSD


AWK è un potente linguaggio di programmazione basato sui dati che fa risalire la sua origine agli albori di Unix. Inizialmente è stato sviluppato per scrivere programmi “one-liner”, ma da allora si è evoluto in un linguaggio di programmazione a tutti gli effetti. AWK prende il nome dalle iniziali dei suoi autori: Aho, Weinberger e Kernighan. Il comando awk in Linux e in altri sistemi Unix richiama l'interprete che esegue gli script AWK. Esistono diverse implementazioni di awk nei sistemi recenti come gawk (GNU awk), mawk (Minimal awk) e nawk (New awk), tra gli altri. Dai un'occhiata agli esempi seguenti se vuoi padroneggiare awk.

Comprensione dei programmi AWK


I programmi scritti in awk consistono di regole, che sono semplicemente una coppia di schemi e azioni. I modelli sono raggruppati tra parentesi graffe {} e la parte di azione viene attivata ogni volta che awk trova testi che corrispondono al modello. Sebbene awk sia stato sviluppato per scrivere righe di una riga, gli utenti esperti possono facilmente scrivere script complessi con esso.

I programmi AWK sono molto utili per l'elaborazione di file su larga scala. Identifica i campi di testo utilizzando caratteri speciali e separatori. Offre anche costrutti di programmazione di alto livello come array e loop. Quindi scrivere programmi robusti usando il semplice awk è molto fattibile.

Esempi pratici del comando awk in Linux


Gli amministratori normalmente utilizzano awk per l'estrazione dei dati e la creazione di report insieme ad altri tipi di manipolazione dei file. Di seguito abbiamo discusso awk in maggiore dettaglio. Segui attentamente i comandi e provali nel tuo terminale per una comprensione completa.

1. Stampa campi specifici dall'output di testo


I comandi Linux più utilizzati visualizzano il proprio output utilizzando vari campi. Normalmente utilizziamo il comando cut di Linux per estrarre un campo specifico da tali dati. Tuttavia, il comando seguente mostra come eseguire questa operazione utilizzando il comando awk.

$ who | awk '{print $1}'

Questo comando visualizzerà solo il primo campo dall'output del comando who. Quindi, otterrai semplicemente i nomi utente di tutti gli utenti attualmente registrati. Qui, $1 rappresenta il primo campo. Devi utilizzare $N se vuoi estrarre l'N-esimo campo.

2. Stampa più campi dall'output di testo


L'interprete awk ci consente di stampare il numero di campi che desideriamo. Gli esempi seguenti ci mostrano come estrarre i primi due campi dall'output del comando who.

$ who | awk '{print $1, $2}'

Puoi anche controllare l'ordine dei campi di output. L'esempio seguente mostra prima la seconda colonna prodotta dal comando who e poi la prima colonna nel secondo campo.

$ who | awk '{print $2, $1}'

Basta tralasciare i parametri del campo ($N) per visualizzare tutti i dati.

3. Utilizza le istruzioni BEGIN


L'istruzione BEGIN consente agli utenti di stampare alcune informazioni note nell'output. Di solito viene utilizzato per formattare i dati di output generati da awk. La sintassi di questa istruzione è mostrata di seguito.

BEGIN { Actions}
{ACTION}

Le azioni che formano la sezione BEGIN vengono sempre attivate. Quindi awk legge le righe rimanenti una per una e vede se è necessario fare qualcosa.

$ who | awk 'BEGIN {print "User\tFrom"} {print $1, $2}'

Il comando precedente etichetterà i due campi di output estratti dall'output del comando who.

4. Utilizza le istruzioni END


Puoi anche utilizzare l'istruzione END per assicurarti che determinate azioni vengano sempre eseguite al termine dell'operazione. Posiziona semplicemente la sezione FINE dopo la serie principale di azioni.

$ who | awk 'BEGIN {print "User\tFrom"} {print $1, $2} END {print "--COMPLETED--"}'

Il comando precedente aggiungerà la stringa data alla fine dell'output.

5. Cerca utilizzando i modelli


Gran parte del funzionamento di awk riguarda il pattern match e le espressioni regolari. Come abbiamo già discusso, awk cerca modelli in ogni riga di input ed esegue l'azione solo quando viene attivata una corrispondenza. Le nostre regole precedenti consistevano solo in azioni. Di seguito, abbiamo illustrato le basi della corrispondenza dei modelli utilizzando il comando awk in Linux.

$ who | awk '/mary/ {print}'

Questo comando vedrà se l'utente mary è attualmente connesso o meno. Se viene trovata una corrispondenza, verrà restituita l'intera riga.

6. Estrai informazioni dai file


Il comando awk funziona molto bene con i file e può essere utilizzato per attività di elaborazione di file complesse. Il comando seguente illustra come awk gestisce i file.

$ awk '/hello/ {print}' /usr/share/dict/american-english

Questo comando cerca il pattern "ciao" nel file del dizionario inglese-americano. È disponibile sulla maggior parte delle distribuzioni basate su Linux. Pertanto, puoi facilmente provare i programmi awk su questo file.

7. Leggi lo script AWK dal file sorgente


Sebbene scrivere programmi di una riga sia utile, puoi anche scrivere programmi di grandi dimensioni utilizzando interamente awk. Ti consigliamo di salvarli ed eseguire il programma utilizzando il file sorgente.

$ awk -f script-file
$ awk --file script-file

L'opzione -f o -file ci permette di specificare il file del programma. Tuttavia, non è necessario utilizzare le virgolette (' ) all'interno del file di script poiché la shell Linux non interpreterà il codice del programma in questo modo.

8. Imposta il separatore del campo di input


Un separatore di campo è un delimitatore che divide il record di input. Possiamo facilmente specificare i separatori di campo da awk utilizzando l'opzione -F o -field-separator. Controlla i comandi seguenti per vedere come funziona.

$ echo "This-is-a-simple-example" | awk -F - ' {print $1} '
$ echo "This-is-a-simple-example" | awk --field-separator - ' {print $1} '

Funziona allo stesso modo quando si utilizzano file di script anziché il comando awk di una riga in Linux.

9. Stampa le informazioni in base alle condizioni


Abbiamo discusso il comando cut di Linux in una guida precedente. Ora ti mostreremo come estrarre informazioni utilizzando awk solo quando vengono soddisfatti determinati criteri. Utilizzeremo lo stesso file di test utilizzato in quella guida. Quindi vai lì e fai una copia del file test.txt.

$ awk '$4 > 50' test.txt

Questo comando stamperà tutte le nazioni dal file test.txt, che ha più di 50 milioni di abitanti.

10. Stampa le informazioni confrontando le espressioni regolari


Il seguente comando awk controlla se il terzo campo di qualsiasi riga contiene il modello "Lira" e stampa l'intera riga se viene trovata una corrispondenza. Utilizziamo nuovamente il file test.txt utilizzato per illustrare il comando cut di Linux. Quindi assicurati di avere questo file prima di procedere.

$ awk '$3 ~ /Lira/' test.txt

Se lo desideri, puoi scegliere di stampare solo una parte specifica di qualsiasi corrispondenza.

11. Conta il numero totale di righe in input


Il comando awk ha molte variabili speciali che ci permettono di fare facilmente molte cose avanzate. Una di queste variabili è NR, che contiene il numero di riga corrente.

$ awk 'END {print NR} ' test.txt

Questo comando mostrerà quante righe sono presenti nel nostro file test.txt. Per prima cosa esegue un'iterazione su ogni riga e, una volta raggiunto END, stamperà il valore di NR, che in questo caso contiene il numero totale di righe.

12. Imposta il separatore del campo di output


In precedenza, abbiamo mostrato come selezionare i separatori dei campi di input utilizzando l'opzione -F o -field-separator. Il comando awk ci consente anche di specificare il separatore del campo di output. L'esempio seguente lo dimostra utilizzando un esempio pratico.

$ date | awk 'OFS="-" {print$2,$3,$6}'

Questo comando stampa la data corrente utilizzando il formato gg-mm-aa. Esegui il programma date senza awk per vedere come appare l'output predefinito.

13. Utilizzo del costrutto If


Come altri linguaggi di programmazione popolari, awk fornisce agli utenti anche i costrutti if-else. L'istruzione if in awk ha la sintassi seguente.

if (expression)
{
  first_action
  second_action
}

Le azioni corrispondenti vengono eseguite solo se l'espressione condizionale è vera. L'esempio seguente lo dimostra utilizzando il nostro file di riferimento test.txt.

$ awk '{ if ($4>100) print }' test.txt

Non è necessario mantenere rigorosamente il rientro.

14. Utilizzo dei costrutti If-Else


Puoi costruire utili ladder if-else utilizzando la sintassi seguente. Sono utili quando si creano script awk complessi che gestiscono dati dinamici.

if (expression)
  first_action
else
  second_action
$ awk '{ if ($4>100) print; else print }' test.txt

Il comando precedente stamperà l'intero file di riferimento poiché il quarto campo non è maggiore di 100 per ogni riga.

15. Imposta la larghezza del campo


A volte i dati di input sono piuttosto confusi e gli utenti potrebbero avere difficoltà a visualizzarli nei loro report. Fortunatamente, awk fornisce una potente variabile incorporata chiamata FIELDWIDTHS che ci consente di definire un elenco di larghezze separate da spazi.

$ echo 5675784464657 | awk 'BEGIN {FIELDWIDTHS= "3 4 5"} {print $1, $2, $3}'

È molto utile quando si analizzano dati sparsi poiché possiamo controllare la larghezza del campo di output esattamente come vogliamo.

16. Imposta il separatore dei record


RS o separatore di record è un'altra variabile integrata che ci consente di specificare come vengono separati i record. Creiamo prima un file che dimostrerà il funzionamento di questa variabile awk.

$ cat new.txt
Melinda James

23 New Hampshire

(222) 466-1234

Daniel James

99 Phonenix Road

(322) 677-3412
$ awk 'BEGIN{FS="\n"; RS=""} {print $1,$3}' new.txt

Questo comando analizzerà il documento e sputerà il nome e l'indirizzo delle due persone.

17. Variabili di ambiente di stampa


Il comando awk in Linux ci consente di stampare facilmente le variabili di ambiente utilizzando la variabile ENVIRON. Il comando seguente mostra come utilizzarlo per stampare il contenuto della variabile PATH.

$ awk 'BEGIN{ print ENVIRON["PATH"] }'

È possibile stampare il contenuto di qualsiasi variabile d'ambiente sostituendo l'argomento della variabile ENVIRON. Il comando seguente stampa il valore della variabile d'ambiente HOME.

$ awk 'BEGIN{ print ENVIRON["HOME"] }'

18. Ometti alcuni campi dall'output


Il comando awk ci consente di omettere righe specifiche dal nostro output. Il seguente comando lo dimostrerà utilizzando il nostro file di riferimento test.txt.

$ awk -F":" '{$2=""; print}' test.txt

Questo comando ometterà la seconda colonna del nostro file, che contiene il nome della capitale di ogni paese. Puoi anche omettere più di un campo, come mostrato nel comando successivo.

$ awk -F":" '{$2="";$3="";print}' test.txt

19. Rimuovi righe vuote


A volte i dati possono contenere troppe righe vuote. Puoi usare il comando awk per rimuovere le righe vuote abbastanza facilmente. Controlla il comando successivo per vedere come funziona nella pratica.

$ awk '/^[ \t]*$/{next}{print}' new.txt

Abbiamo rimosso tutte le righe vuote dal file new.txt utilizzando una semplice espressione regolare e un awk integrato chiamato next.

20. Rimuovi gli spazi bianchi finali


L'output di molti comandi Linux contiene spazi bianchi finali. Possiamo usare il comando awk in Linux per rimuovere spazi bianchi come spazi e tabulazioni. Controlla il comando seguente per vedere come affrontare tali problemi utilizzando awk.

$ awk '{sub(/[ \t]*$/, "");print}' new.txt test.txt

Aggiungi alcuni spazi bianchi finali ai nostri file di riferimento e verifica se awk li ha rimossi con successo o meno. Lo ha fatto con successo nella mia macchina.

21. Controlla il numero di campi in ciascuna riga


Possiamo facilmente verificare quanti campi ci sono in una riga utilizzando un semplice one-liner awk. Ci sono molti modi per farlo, ma utilizzeremo alcune delle variabili integrate in awk per questo compito. La variabile NR ci fornisce il numero di riga e la variabile NF fornisce il numero di campi.

$ awk '{print NR,"-->",NF}' test.txt

Ora possiamo verificare quanti campi ci sono per riga nel nostro documento test.txt. Poiché ogni riga di questo file contiene 5 campi, siamo certi che il comando funzioni come previsto.

22. Verifica il nome file corrente


La variabile awk FILENAME viene utilizzata per verificare il nome del file di input corrente. Stiamo dimostrando come funziona utilizzando un semplice esempio. Tuttavia, può essere utile in situazioni in cui il nome file non è noto esplicitamente o è presente più di un file di input.

$ awk '{print FILENAME}' test.txt
$ awk '{print FILENAME}' test.txt new.txt

I comandi precedenti stampano il nome del file su cui awk sta lavorando ogni volta che elabora una nuova riga dei file di input.

23. Verifica il numero di record elaborati


L'esempio seguente mostrerà come possiamo verificare il numero di record elaborati dal comando awk. Poiché un gran numero di amministratori di sistemi Linux utilizzano awk per generare report, è molto utile per loro.

$ awk '{print "Processing Record - ",NR;} END {print "\nTotal Records Processed:", NR;}' test.txt

Uso spesso questo frammento di awk per avere una visione chiara delle mie azioni. Puoi facilmente modificarlo per accogliere nuove idee o azioni.

24. Stampa il numero totale di caratteri in un record


Il linguaggio awk fornisce una comoda funzione chiamata length() che ci dice quanti caratteri sono presenti in un record. È molto utile in una serie di scenari. Dai una rapida occhiata al seguente esempio per vedere come funziona.

$ echo "A random text string..." | awk '{ print length($0); }'
$ awk '{ print length($0); }' /etc/passwd

Il comando precedente stamperà il numero totale di caratteri presenti in ciascuna riga della stringa o del file di input.

25. Stampa tutte le righe più lunghe di una lunghezza specificata


Possiamo aggiungere alcuni condizionali al comando precedente e far sì che stampi solo le righe che sono maggiori di una lunghezza predefinita. È utile quando hai già un'idea della lunghezza di un record specifico.

$ echo "A random text string..." | awk 'length($0) > 10'
$ awk '{ length($0) > 5; }' /etc/passwd

Puoi inserire più opzioni e/o argomenti per modificare il comando in base alle tue esigenze.

26. Stampa il numero di righe, caratteri e parole


Il seguente comando awk in Linux stampa il numero di righe, caratteri e parole in un dato input. Utilizza la variabile NR e alcuni calcoli aritmetici di base per eseguire questa operazione.

$ echo "This is a input line..." | awk '{ w += NF; c += length + 1 } END { print NR, w, c }'

Mostra che nella stringa di input sono presenti 1 riga, 5 parole ed esattamente 24 caratteri.

27. Calcola la frequenza delle parole


Possiamo combinare array associativi e il ciclo for in awk per calcolare la frequenza delle parole di un documento. Il seguente comando può sembrare un po' complesso, ma è abbastanza semplice una volta compresi chiaramente i costrutti di base.

$ awk 'BEGIN {FS="[^a-zA-Z]+" } { for (i=1; i<=NF; i++) words[tolower($i)]++ } END { for (i in words) print i, words[i] }' test.txt

Se riscontri problemi con lo snippet di una riga, copia il seguente codice in un nuovo file ed eseguilo utilizzando il sorgente.

$ cat > frequency.awk
BEGIN {
FS="[^a-zA-Z]+"
}
{
for (i=1; i<=NF; i++)
words[tolower($i)]++
}
END {
for (i in words)
print i, words[i]
}

Quindi eseguilo utilizzando l'opzione -f.

$ awk -f frequency.awk test.txt

28. Rinomina i file utilizzando AWK


Il comando awk può essere utilizzato per rinominare tutti i file che corrispondono a determinati criteri. Il seguente comando illustra come utilizzare awk per rinominare tutti i file .MP3 in una directory in file .mp3.

$ touch {a,b,c,d,e}.MP3
$ ls *.MP3 | awk '{ printf("mv \"%s\" \"%s\"\n", $0, tolower($0)) }'
$ ls *.MP3 | awk '{ printf("mv \"%s\" \"%s\"\n", $0, tolower($0)) }' | sh

Innanzitutto, abbiamo creato alcuni file demo con estensione .MP3. Il secondo comando mostra all'utente cosa succede quando la ridenominazione ha esito positivo. Infine, l'ultimo comando esegue l'operazione di ridenominazione utilizzando il comando mv in Linux.

29. Stampa la radice quadrata di un numero


AWK offre diverse funzioni integrate per manipolare i numeri. Una di queste è la funzione sqrt(). È una funzione simile al C che restituisce la radice quadrata di un determinato numero. Dai una rapida occhiata al prossimo esempio per vedere come funziona in generale.

$ awk 'BEGIN{ print sqrt(36); print sqrt(0); print sqrt(-16) }'

Poiché non è possibile determinare la radice quadrata di un numero negativo, l'output mostrerà una parola chiave speciale chiamata "nan" al posto di sqrt(-12).

30. Stampa il logaritmo di un numero


La funzione awk log() fornisce il logaritmo naturale di un numero. Tuttavia, funzionerà solo con numeri positivi, quindi fai attenzione a convalidare l’input degli utenti. Altrimenti qualcuno potrebbe violare i tuoi programmi awk e ottenere accesso non privilegiato alle risorse di sistema.

$ awk 'BEGIN{ print log(36); print log(0); print log(-16) }'

Dovresti vedere il logaritmo di 36 e verificare che il logaritmo di 0 sia infinito e che il logaritmo di un valore negativo sia "Non è un numero" o nan.

31. Stampa l'esponenziale di un numero


L'esponenziale os di un numero n fornisce il valore di e^n. Di solito viene utilizzato negli script awk che gestiscono numeri grandi o logica aritmetica complessa. Possiamo generare l'esponenziale di un numero usando la funzione integrata awk exp().

$ awk 'BEGIN{ print exp(30); print log(0); print exp(-16) }'

Tuttavia, awk non può calcolare l'esponenziale per numeri estremamente grandi. Dovresti eseguire tali calcoli utilizzando linguaggi di programmazione di basso livello come C e fornire il valore ai tuoi script awk.

32. Genera numeri casuali utilizzando AWK


Possiamo utilizzare il comando awk in Linux per generare numeri casuali. Questi numeri saranno compresi tra 0 e 1, ma mai 0 o 1. Puoi moltiplicare un valore fisso con il numero risultante per ottenere un valore casuale maggiore.

$ awk 'BEGIN{ print rand(); print rand()*99 }'

La funzione rand() non necessita di alcun argomento. Inoltre, i numeri generati da questa funzione non sono esattamente casuali ma piuttosto pseudo-casuali. Inoltre, è abbastanza facile prevedere questi numeri di corsa in corsa. Quindi non dovresti fare affidamento su di loro per calcoli sensibili.

33. Avvisi del compilatore colore in rosso


I moderni compilatori Linux genereranno avvisi se il codice non mantiene gli standard linguistici o presenta errori che non interrompono l'esecuzione del programma. Il seguente comando awk stamperà in rosso le righe di avviso generate da un compilatore.

$ gcc -Wall main.c |& awk '/: warning:/{print "\x1B[01;31m" $0 "\x1B[m";next;}{print}'

Questo comando è utile se si desidera individuare in modo specifico gli avvisi del compilatore. Puoi usare questo comando con qualsiasi compilatore diverso da gcc, assicurati solo di cambiare il modello /: warning:/ per riflettere quel particolare compilatore.

34. Stampa le informazioni UUID del filesystem


L'UUID o Universally Unique Identifier è un numero che può essere utilizzato per identificare risorse come il filesystem Linux. Possiamo semplicemente stampare le informazioni UUID del nostro filesystem utilizzando il seguente comando awk di Linux.

$ awk '/UUID/ {print $0}' /etc/fstab

Questo comando cerca l'UUID del testo nel file /etc/fstab utilizzando i modelli awk. Restituisce un commento dal file a cui non siamo interessati. Il comando seguente farà in modo di ottenere solo le righe che iniziano con UUID.

$ awk '/^UUID/ {print $1}' /etc/fstab

Limita l'output al primo campo. Quindi otteniamo solo i numeri UUID.

35. Stampa la versione dell'immagine del kernel Linux


Diverse immagini del kernel Linux vengono utilizzate da varie distribuzioni Linux. Possiamo facilmente stampare l'esatta immagine del kernel su cui è basato il nostro sistema usando awk. Controlla il seguente comando per vedere come funziona in generale.

$ uname -a | awk '{print $3}'

Abbiamo prima eseguito il comando uname con l'opzione -a e poi abbiamo inviato questi dati ad awk. Quindi abbiamo estratto le informazioni sulla versione dell'immagine del kernel utilizzando awk.

36. Aggiungi i numeri di riga prima delle righe


Gli utenti potrebbero incontrare molto spesso file di testo che non contengono numeri di riga. Fortunatamente, puoi facilmente aggiungere numeri di riga a un file usando il comando awk in Linux. Dai un'occhiata da vicino all'esempio seguente per vedere come funziona nella vita reale.

$ awk '{ print FNR ". " $0 ;next}{print}' test.txt

Il comando precedente aggiungerà un numero di riga prima di ciascuna riga nel nostro file di riferimento test.txt. Utilizza la variabile awk integrata FNR per risolvere questo problema.

37. Stampa un file dopo aver ordinato i contenuti


Possiamo anche usare awk per stampare un elenco ordinato di tutte le righe. I seguenti comandi stampano il nome di tutti i paesi nel nostro test.txt in ordine ordinato.

$ awk -F ':' '{ print $1 }' test.txt | sort

Il comando successivo stamperà il nome di accesso di tutti gli utenti dal file /etc/passwd.

$ awk -F ':' '{ print $1 }' /etc/passwd | sort

Puoi facilmente cambiare l'ordine di ordinamento modificando il comando sort.

38. Stampa la pagina manuale


La pagina man contiene informazioni dettagliate sul comando awk insieme a tutte le opzioni disponibili. È estremamente importante per le persone che vogliono padroneggiare a fondo il comando awk.

$ man awk

Se vuoi imparare le funzionalità complesse di awk, questo ti sarà di grande aiuto. Consulta questa documentazione ogni volta che riscontri un problema.

39. Stampa la pagina della guida


La pagina della guida contiene informazioni riepilogative su tutti i possibili argomenti della riga di comando. Puoi richiamare la guida di aiuto per awk utilizzando uno dei seguenti comandi.

$ awk -h
$ awk --help

Consulta questa pagina se desideri una rapida panoramica di tutte le opzioni disponibili per awk.

40. Stampa le informazioni sulla versione


Le informazioni sulla versione ci forniscono informazioni sulla build di un programma. La pagina della versione di awk contiene informazioni come il copyright, gli strumenti di compilazione e così via. Puoi visualizzare queste informazioni utilizzando uno dei seguenti comandi awk.

$ awk -V
$ awk --version

Pensieri finali


Il comando awk in Linux ci consente di fare ogni genere di cose, inclusa l'elaborazione dei file e la manutenzione del sistema. Fornisce una vasta gamma di operazioni per gestire le attività informatiche quotidiane abbastanza facilmente. I nostri redattori hanno compilato questa guida con 40 utili comandi awk che possono essere utilizzati per la manipolazione o l'amministrazione del testo. Poiché AWK è un linguaggio di programmazione a tutti gli effetti, esistono diversi modi per svolgere lo stesso lavoro. Quindi, non chiederci perché stiamo facendo certe cose in modo diverso. Puoi sempre curare le tue ricette in base alle tue competenze ed esperienza. Lasciaci i tuoi pensieri e facci sapere se hai domande.

Articoli correlati