GNU/Linux >> Linux Esercitazione >  >> Linux

40 Comando awk pratico e utile in Linux e BSD

AWK è un potente linguaggio di programmazione basato sui dati che risale ai primi giorni di Unix. Inizialmente è stato sviluppato per scrivere programmi "one-liner", ma da allora si è evoluto in un vero e proprio linguaggio di programmazione. AWK prende il nome dalle iniziali dei suoi autori:Aho, Weinberger e Kernighan. Il comando awk in Linux e altri sistemi Unix richiama l'interprete che esegue gli script AWK. Esistono diverse implementazioni di awk in 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 sono costituiti da regole, che sono semplicemente un paio di schemi e azioni. I modelli sono raggruppati all'interno di una parentesi graffa {} e la parte dell'azione viene attivata ogni volta che awk trova testi che corrispondono al modello. Sebbene awk sia stato sviluppato per scrivere battute, 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 usano awk per l'estrazione dei dati e la creazione di report insieme ad altri tipi di manipolazioni di file. Di seguito abbiamo discusso di awk in modo più dettagliato. Segui attentamente i comandi e provali sul tuo terminale per una comprensione completa.

1. Stampa campi specifici dall'output di testo

I comandi Linux più utilizzati mostrano il loro 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 farlo usando 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 qualsiasi numero di campi 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}'

Tralascia semplicemente i parametri del campo ($N ) per visualizzare tutti i dati.

3. Usa le dichiarazioni 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 per questa istruzione è mostrata di seguito.

BEGIN { Actions}
{ACTION}

Le azioni che formano la sezione BEGIN sono 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. Usa le dichiarazioni 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 l'insieme 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 coinvolge il pattern matching e la regex. Come abbiamo già discusso, awk cerca i 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 del pattern matching usando il comando awk in Linux.

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

Questo comando vedrà se l'utente mary è attualmente connesso o meno. Verrà visualizzata l'intera riga se viene trovata una corrispondenza.

6. Estrai informazioni dai file

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

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

Questo comando cerca il modello "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 one-liner sia utile, puoi anche scrivere programmi di grandi dimensioni usando interamente awk. Ti consigliamo di salvarli ed eseguire il tuo programma utilizzando il file sorgente.

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

Il -f o –file l'opzione ci permette di specificare il file di programma. Tuttavia, non è necessario utilizzare le virgolette (' ') all'interno del file di script poiché la shell di 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 per awk usando il -F o –separatore di campo opzione. Dai un'occhiata ai 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 one-liner in Linux.

9. Stampa le informazioni in base alla condizione

Abbiamo discusso del comando Linux cut in una guida precedente. Ora ti mostreremo come estrarre informazioni usando awk solo quando determinati criteri sono abbinati. Utilizzeremo lo stesso file di prova che abbiamo utilizzato in quella guida. Quindi vai lì e fai una copia del test.txt file.

$ 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. Stiamo ancora utilizzando 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

Puoi scegliere di stampare solo una parte specifica di qualsiasi corrispondenza, se lo desideri.

11. Conta il numero totale di righe in input

Il comando awk ha molte variabili per scopi speciali che ci consentono 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 produrrà quante righe ci sono nel nostro file test.txt. Prima itera su ogni riga e, una volta raggiunta END, stampa 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 -F o –separatore di campo opzione. 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 della data senza awk per vedere come appare l'output predefinito.

13. Utilizzo del costrutto If

Come altri popolari linguaggi di programmazione, anche awk fornisce agli utenti 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 di costrutti If-Else

Puoi costruire utili scale if-else usando la sintassi seguente. Sono utili quando si creano script awk complessi che trattano 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 disordinati e gli utenti potrebbero avere difficoltà a visualizzarli nei loro rapporti. Fortunatamente, awk fornisce una potente variabile incorporata chiamata FIELDWIDTHS che ci consente di definire un elenco di larghezze separate da spazi bianchi.

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

È molto utile durante l'analisi di dati sparsi poiché possiamo controllare la larghezza del campo di output esattamente come vogliamo.

16. Imposta il separatore di record

Il RS o Record Separator è un'altra variabile incorporata che ci consente di specificare come vengono separati i record. Per prima cosa creiamo 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. Stampa variabili d'ambiente

Il comando awk in Linux ci permette di stampare facilmente le variabili d'ambiente usando la variabile ENVIRON. Il comando seguente mostra come usarlo per stampare il contenuto della variabile PATH.

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

È possibile stampare il contenuto di qualsiasi variabile di 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 comando seguente 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 per ogni paese. Puoi anche omettere più di un campo, come mostrato nel comando successivo.

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

19. Rimuovi le righe vuote

A volte i dati possono contenere troppe righe vuote. Puoi usare il comando awk per rimuovere le righe vuote abbastanza facilmente. Dai un'occhiata al comando successivo per vedere come funziona in pratica.

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

Abbiamo rimosso tutte le righe vuote dal file new.txt usando una semplice espressione regolare e un built-in awk 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 tali spazi bianchi come spazi e schede. Dai un'occhiata al comando seguente per vedere come affrontare tali problemi usando 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 correttamente o meno. Lo ha fatto con successo nella mia macchina.

21. Controlla il numero di campi in ogni riga

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

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

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

22. Verifica il nome del file corrente

La variabile awk FILENAME viene utilizzata per verificare il nome del file di input corrente. Stiamo dimostrando come funziona usando un semplice esempio. Tuttavia, può essere utile in situazioni in cui il nome del file non è noto in modo esplicito 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 verificare il numero di record elaborati dal comando awk. Poiché un gran numero di amministratori di sistema Linux utilizza 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 chiara panoramica delle mie azioni. Puoi facilmente modificarlo per adattarlo a nuove idee o azioni.

24. Stampa il numero totale di caratteri in un record

Il linguaggio awk fornisce una pratica funzione chiamata length() che ci dice quanti caratteri sono presenti in un record. È molto utile in diversi 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 ogni 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 fare in modo che stampi solo quelle 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 alcune operazioni aritmetiche 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 comando seguente 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 one-liner, copia il codice seguente in un nuovo file ed eseguilo utilizzando il codice 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 usando -f opzione.

$ awk -f frequency.awk test.txt

28. Rinomina i file utilizzando AWK

Il comando awk può essere utilizzato per rinominare tutti i file che soddisfano determinati criteri. Il comando seguente 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. Uno di questi è la funzione sqrt(). È una funzione simile a C che restituisce la radice quadrata di un dato 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 visualizzerà una parola chiave speciale denominata "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 interrompere i tuoi programmi awk e ottenere un 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 il log di un valore negativo sia "Non un numero" o nan.

31. Stampa l'esponenziale di un numero

L'esponenziale os un numero n fornisce il valore di e^n. Di solito è usato negli script awk che trattano numeri grandi o complesse logiche aritmetiche. Possiamo generare l'esponenziale di un numero usando la funzione incorporata 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 il C e inserire il valore nei tuoi script awk.

32. Genera numeri casuali usando 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 più grande.

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

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

33. Avvisi del compilatore colore in rosso

I moderni compilatori Linux genereranno avvisi se il codice non mantiene gli standard del linguaggio 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 usando il seguente comando Linux awk.

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

Questo comando cerca l'UUID di testo in /etc/fstab file utilizzando modelli awk. Restituisce un commento dal file che non ci interessa. Il comando seguente si assicurerà di ottenere solo quelle 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 si basa il nostro sistema usando awk. Dai un'occhiata al comando seguente per vedere come funziona in generale.

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

Abbiamo prima emesso il comando uname con -a opzione e quindi reindirizzato questi dati a awk. Quindi abbiamo estratto le informazioni sulla versione dell'immagine del kernel usando awk.

36. Aggiungi i numeri di riga prima delle righe

Gli utenti possono incontrare 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 delle righe nel nostro file di riferimento test.txt. Utilizza la variabile awk FNR integrata 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.

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

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

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

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

38. Stampa la pagina del manuale

La pagina di manuale 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 funzioni complesse di awk, questo ti sarà di grande aiuto. Consulta questa documentazione ogni volta che sei bloccato con un problema.

39. Stampa la pagina di aiuto

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

$ awk -h
$ awk --help

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

40. Informazioni sulla versione di stampa

Le informazioni sulla versione ci forniscono informazioni sulla build di un programma. La pagina della versione per awk contiene informazioni come il suo copyright, 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 qualsiasi cosa, inclusa l'elaborazione dei file e la manutenzione del sistema. Fornisce una vasta gamma di operazioni per gestire abbastanza facilmente le attività di elaborazione quotidiane. I nostri editori 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, ci sono diversi modi per fare lo stesso lavoro. Quindi, non chiederti perché stiamo facendo certe cose in un modo diverso. Puoi sempre curare le tue ricette in base alle tue competenze ed esperienza. Lasciaci i tuoi pensieri, facci sapere se hai domande.


Linux
  1. Una guida pratica per imparare awk

  2. 12 utili esempi di comandi Wget in Linux

  3. 25 Utili comandi find Esempi pratici in Linux

  4. Comandi Linux:job, bg e fg

  5. Il comando AWK di Linux:esempi di sintassi di utilizzo di Linux e Unix

12 Esempi pratici di In Command in Linux

50 esempi semplici e utili di comando Trova in Linux

40 Comando awk pratico e utile in Linux e BSD

16 Esempi pratici e utili di Echo Command in Linux

7 Utilizzo essenziale e pratico del comando Incolla in Linux

19 Suggerimenti e trucchi utili per la riga di comando di Linux