gawk è l'implementazione GNU del linguaggio di programmazione Awk, sviluppato per la prima volta per il sistema operativo UNIX negli anni '70. Il linguaggio di programmazione Awk è specializzato nella gestione della formattazione dei dati nei file di testo, in particolare i dati di testo organizzati in colonne.
Utilizzando il linguaggio di programmazione Awk, puoi manipolare o estrarre dati, generare report, abbinare modelli, eseguire calcoli e altro, con grande flessibilità. Awk ti consente di eseguire compiti alquanto difficili con una singola riga di codice. Per ottenere gli stessi risultati utilizzando linguaggi di programmazione tradizionali come C o Python richiederebbe uno sforzo aggiuntivo e molte righe di codice.
gawk
si riferisce anche all'utilità della riga di comando disponibile per impostazione predefinita con la maggior parte delle distribuzioni Linux. La maggior parte delle distribuzioni fornisce anche un collegamento simbolico per awk
indicando gawk
. Per semplicità, d'ora in poi, faremo riferimento all'utilità solo come awk
.
awk
elabora i dati direttamente dallo standard input - STDIN. Un modello comune consiste nel reindirizzare l'output di altri programmi in awk
per estrarre e stampare dati, ma awk
può anche elaborare dati da file.
In questo articolo utilizzerai awk
per analizzare i dati da un file con colonne separate da spazi. Iniziamo esaminando i dati di esempio.
Dati di esempio
Per gli esempi in questa guida, utilizziamo l'output del comando ps ux
salvato nel file psux.out
. Ecco un esempio dei dati nel file:
$ head psux.outUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDricardo 1446 0.0 0.2 21644 11536 ? Ss Sep10 0:00 /usr/lib/systemd/systemd --userricardo 1448 0.0 0.1 49212 5848 ? S 10 settembre 0:00 (sd-pam)ricardo 1459 0,0 0,1 447560 7148 ? SL Sep10 0:00 /usr/bin/gnome-keyring-daemon --daemonize --loginricardo 1467 0.0 0.1 369144 6080 tty2 Ssl+ Sep10 0:00 /usr/libexec/gdm-wayland-session /usr/bin/gnome-sessionricardo 1469 0,0 0,1 277692 4112 ? Ss Sep10 0:00 /usr/bin/dbus-broker-launch --scope userricardo 1471 0.0 0.1 6836 4408 ? S Sep10 00:00 dbus-mediatore --log 4 --controller 11 --machine-id 16355057c7274843823dd747f8e2978b --max-byte 100000000000000 --max-FDS 25000000000000 --max-match 5000000000ricardo 1474 0,0 0,3 467744 14132 tty2 Sl + Sep10 0:00 /usr/libexec/gnome-session-binaryricardo 1531 0.0 0.1 297456 4280 ? Ssl 10 settembre 0:00 /usr/libexec/gnome-session-ctl --monitorricardo 1532 0.0 0.3 1230908 12920 ? S
Puoi scaricare il file completo da qui, usando questo comando:
$ curl -o psux.out https://gitlab.com/-/snippets/2013935/raw\?inline\=false
Se decidi di utilizzare l'output di ps ux
sul tuo sistema, regola i valori mostrati negli esempi in modo che corrispondano ai tuoi risultati.
Quindi, utilizziamo awk
per visualizzare i dati dal file di esempio.
Utilizzo di base
Un awk
di base il programma consiste in uno schema seguito da un'azione racchiusa tra parentesi graffe. Puoi fornire un programma a awk
utilità inline racchiudendola tra virgolette singole, in questo modo:
$ awk 'pattern { azione }'
awk
elabora i dati di input - input standard o file - riga per riga, eseguendo l'azione specificata per ogni riga - o record - che corrisponde al modello. Se il modello viene omesso, awk
esegue l'azione su tutti i record. Un'azione può essere semplice come stampare dati dalla linea o complessa come un programma completo. Ad esempio, per stampare tutte le righe del file di esempio, utilizzare questo comando:
$ awk '{ print }' psux.outUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDricardo 1446 0.0 0.2 21644 11536 ? Ss Sep10 0:00 /usr/lib/systemd/systemd --user.... OUTPUT TRUNCATED ....
Anche se questo esempio non è molto utile, illustra il awk
utilizzo di base del comando.
Se stai utilizzando il comando ps ux
sulla tua macchina, puoi reindirizzare il suo output direttamente in awk
, invece di fornire il nome del file di input:
$ ps ux | awk '{ print }'
Quindi, utilizziamo awk
capacità di elaborazione delle colonne per estrarre parte dei dati dal file di esempio.
Stampa campi
Il potere di awk
inizia a diventare evidente quando si utilizzano le sue funzionalità di elaborazione delle colonne. awk
divide automaticamente ogni riga, o record, in campi. Per impostazione predefinita, utilizza lo spazio carattere per separare ogni campo, ma puoi cambiarlo fornendo il parametro della riga di comando -F
seguito dal separatore desiderato.
Dopo la divisione, awk
assegna ogni campo a una variabile numerata, iniziando con il carattere $
. Ad esempio, il primo campo è $1
, il secondo $2
, e così via. La variabile speciale $0
contiene l'intero record prima della divisione.
Utilizzando le variabili di campo, è possibile estrarre i dati dall'input. Ad esempio, per stampare solo il nome del comando dal file di esempio, utilizzare la variabile $11
perché il nome del comando è l'undicesima colonna su ogni riga:
$ awk '{ print $11 }' psux.outCOMMAND/usr/lib/systemd/systemd(sd-pam)/usr/bin/gnome-keyring-daemon.... OUTPUT TRUNCATED ....
Puoi anche stampare più campi separandoli con virgole. Ad esempio, per stampare il nome del comando e l'utilizzo della CPU nella colonna tre, utilizzare questo comando:
$ awk '{ print $11, $3 }' psux.outCOMMAND %CPU/usr/lib/systemd/systemd 0.0(sd-pam) 0.0/usr/bin/gnome-keyring-daemon 0.0... .USCITA troncata ....
Infine, usa il built-in printf
funzione per formattare l'output e allineare le colonne. Fornisci un riempimento di 40 caratteri a destra delle prime colonne per ospitare nomi di comandi più lunghi:
Ora che puoi manipolare ed estrarre i singoli campi da ogni record, applichiamo la funzione pattern per filtrare i record.
[ Potrebbe piacerti anche: Manipolazione del testo dalla riga di comando con sed ]
Corrispondenza del modello
Oltre a manipolare i campi, awk
ti consente di filtrare su quali record eseguire azioni attraverso una potente funzione di corrispondenza dei modelli. Nel suo utilizzo più elementare, fornisci un'espressione regolare racchiusa da slash /
caratteri per abbinare i record. Ad esempio, per filtrare i record che corrispondono a firefox , usa /firefox/
:
$ awk '/firefox/ { print $11, $3 }' psux.out/usr/lib64/firefox/firefox 66.2/usr/lib64/firefox/firefox 8.3/usr/lib64/firefox/firefox 15.6/ usr/lib64/firefox/firefox 9.0/usr/lib64/firefox/firefox 31.5/usr/lib64/firefox/firefox 20.6/usr/lib64/firefox/firefox 31.0/usr/lib64/firefox/firefox 0.0/usr/lib64/firefox /firefox 0.0/usr/lib64/firefox/firefox 0.0/usr/lib64/firefox/firefox 0.0/usr/lib64/firefox/firefox 0.0/usr/lib64/firefox/firefox 0.0
È inoltre possibile utilizzare i campi e un'espressione di confronto come criteri di corrispondenza dei modelli. Ad esempio, per stampare i dati del processo che corrispondono al PID 6685, confrontare il campo $2
, in questo modo:
$ awk '$2==6685 { print $11, $3 }' psux.out/usr/lib64/firefox/firefox 0.0
awk
è abbastanza intelligente da comprendere i campi numerici, consentendoti di utilizzare confronti relativi come maggiore o minore di. Ad esempio, per mostrare tutti i processi che utilizzano oltre il 5% di CPU , usa $3> 5
:
$ awk '$3> 5 { print $11, $3 }' psux.out/usr/bin/gnome-shell 5.1/usr/lib64/firefox/firefox 66.2/usr/lib64/firefox/firefox 8.3/ usr/lib64/firefox/firefox 15.6/usr/lib64/firefox/firefox 9.0/usr/lib64/firefox/firefox 31.5/usr/lib64/firefox/firefox 20.6/usr/lib64/firefox/firefox 31.0
È possibile combinare i modelli con gli operatori. Ad esempio, per mostrare tutti i processi che corrispondono a firefox e usa oltre il 5% di CPU , combina entrambi i modelli con &&
operatore per un AND
logico :
$ awk '/firefox/ &&$3> 5 { print $11, $3 }' psux.out/usr/lib64/firefox/firefox 66.2/usr/lib64/firefox/firefox 8.3/usr/lib64/firefox /firefox 15.6/usr/lib64/firefox/firefox 9.0/usr/lib64/firefox/firefox 31.5/usr/lib64/firefox/firefox 20.6/usr/lib64/firefox/firefox 31.0
Infine, poiché stai utilizzando la corrispondenza dei modelli, awk
non stampa più la riga di intestazione. Puoi aggiungere la tua riga di intestazione utilizzando BEGIN
pattern per eseguire una singola azione prima di elaborare qualsiasi record:
$ awk 'BEGIN { printf("%-26s %s\n", "Command", "CPU%")} $3> 10 { print $11, $3 }' psux.outCommand CPU%/usr /lib64/firefox/firefox 66.2/usr/lib64/firefox/firefox 15.6/usr/lib64/firefox/firefox 31.5/usr/lib64/firefox/firefox 20.6/usr/lib64/firefox/firefox 31.0
Quindi, manipoliamo i dati nei singoli campi.
Manipolazione sul campo
Come abbiamo discusso nella sezione precedente, awk
comprende i campi numerici. Ciò consente di eseguire la manipolazione dei dati, inclusi i calcoli numerici. Ad esempio, considera di stampare l'utilizzo della memoria nella colonna sei per tutti firefox processi:
$ awk '/firefox/ { print $11, $6 }' psux.out/usr/lib64/firefox/firefox 301212/usr/lib64/firefox/firefox 118220/usr/lib64/firefox/firefox 168468/ usr/lib64/firefox/firefox 101520/usr/lib64/firefox/firefox 194336/usr/lib64/firefox/firefox 111864/usr/lib64/firefox/firefox 163440/usr/lib64/firefox/firefox 38496/usr/lib64/firefox /firefox 174636/usr/lib64/firefox/firefox 37264/usr/lib64/firefox/firefox 30608/usr/lib64/firefox/firefox 174636/usr/lib64/firefox/firefox 174660
Il comando ps ux
visualizza l'utilizzo della memoria in Kilobyte, che è difficile da leggere. Convertiamolo in Megabyte sottraendo il valore del campo di 1024:
$ awk '/firefox/ { print $11, $6/1024 }' psux.out/usr/lib64/firefox/firefox 294.152/usr/lib64/firefox/firefox 115.449/usr/lib64/firefox/firefox 164.52/usr/lib64/firefox/firefox 99.1406/usr/lib64/firefox/firefox 189.781/usr/lib64/firefox/firefox 109.242/usr/lib64/firefox/firefox 159.609/usr/lib64/firefox/firefox 37.5964/usr/lib64 /firefox/firefox 170.543/usr/lib64/firefox/firefox 36.3906/usr/lib64/firefox/firefox 29.8906/usr/lib64/firefox/firefox 170.543/usr/lib64/firefox/firefox 170.566
Puoi anche arrotondare i numeri per eccesso e aggiungere il suffisso MB utilizzando printf
per migliorare la leggibilità:
$ awk '/firefox/ { printf("%s %4.0f MB\n", $11, $6/1024) }' psux.out/usr/lib64/firefox/firefox 294 MB/usr/ lib64/firefox/firefox 115 MB/usr/lib64/firefox/firefox 165 MB/usr/lib64/firefox/firefox 99 MB/usr/lib64/firefox/firefox 190 MB/usr/lib64/firefox/firefox 109 MB/usr/ lib64/firefox/firefox 160 MB/usr/lib64/firefox/firefox 38 MB/usr/lib64/firefox/firefox 171 MB/usr/lib64/firefox/firefox 36 MB/usr/lib64/firefox/firefox 30 MB/usr/ lib64/firefox/firefox 171 MB/usr/lib64/firefox/firefox 171 MB
Infine, combina questa idea con BEGIN
e END
modelli per eseguire una manipolazione dei dati più avanzata. Ad esempio, calcoliamo l'utilizzo totale della memoria per tutti i firefox processi definendo una variabile somma nel INIZIO
azione, aggiungendo il valore della colonna sei $6
per ogni riga che corrisponde a firefox alla somma variabile, quindi stamparla con END
azione in Megabyte:
$ awk 'BEGIN { sum=0 } /firefox/ { sum+=$6 } END { printf("Memoria totale di Firefox:%.0f MB\n", sum/1024) }' psux.outTotal Firefox memoria:1747 MB
[ Scarica ora:una guida per l'amministratore di sistema allo scripting Bash. ]
Cosa c'è dopo?
gawk
è uno strumento potente e flessibile per elaborare i dati di testo, in particolare i dati disposti in colonne. Questo articolo ha fornito alcuni esempi utili dell'utilizzo di questo strumento per estrarre e manipolare dati, ma gawk
può fare molto di più. Per ulteriori informazioni su gawk
, consulta le pagine di manuale nella tua distribuzione Linux.
Il linguaggio Awk ha molte più risorse di quelle che abbiamo esplorato in questa guida. Per informazioni dettagliate a riguardo, consulta la Guida per l'utente ufficiale di GNU Awk.