GNU/Linux >> Linux Esercitazione >  >> Linux

Una guida per principianti a gawk

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:

; /bin/gnome-keyring-daemon            0.0/usr/libexec/gdm-wayland-session         0.0.... OUTPUT TRUNCATED ....

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.


Linux
  1. Una guida pratica per imparare awk

  2. Una guida per principianti alla creazione di reindirizzamenti in un file .htaccess

  3. Guida completa per principianti alla registrazione Docker

  4. La guida completa per principianti a LVM in Linux

  5. AWK Vs NAWK Vs GAWK

Come utilizzare AppImage su Linux (Guida per principianti)

Guida per principianti alla politica di riavvio di Docker

50 utili comandi Raspberry Pi:una guida per principianti

Guida per principianti all'analisi dei registri in Linux con il comando journalctl

Guida per principianti ai Syslog in Linux

Ottenere il vantaggio di PowerShell su Linux:una guida per principianti