AWK è uno dei comandi più potenti in Linux. Puoi gestire i dati e generare rapporti utilizzando il comando awk. Ci consente inoltre di utilizzare operazioni logiche, variabili, funzioni di stampa e molto altro. AWK sta per "Aho, Weinberger and Kernighan" ed è utilizzato principalmente per la scansione e l'elaborazione di modelli. Cerca in uno o più file per vedere se contengono righe che corrispondono al modello specificato e quindi esegue le azioni associate. Legge da un file o dal suo standard input e invia al suo standard output. Per ogni riga, corrisponde al modello dato nell'ordine indicato, se le corrispondenze eseguono l'azione corrispondente.
Caratteristiche
• Visualizza un file di testo come record e campi
• Ha variabili, condizionali e loop
• Dispone di operatori aritmetici e di stringa
• Può generare rapporti formattati
• Leggere e modificare il testo da una stringa o un file
In questo tutorial, daremo un'occhiata al comando AWK Linux con esempi e vedremo cosa può fare.
Sintassi di base di AWK
La sintassi di base del comando AWK è mostrata di seguito:
awk options program input-file
Di seguito viene mostrata una breve spiegazione di ciascuna opzione:
• -F fs :Usato per specificare un separatore di file.
• -f file :utilizzato per specificare un file che contiene lo script awk.
• -v var=value :Usato per dichiarare una variabile.
Useremo il seguente file di testo come file di input per tutti gli esempi in questo articolo:
cat > contents.txt
hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
Ora controlliamo il contenuto del file denominato 'contents.txt' con il comando AWK:
awk '{print}' contents.txt
Questo stamperà il contenuto del file come mostrato di seguito:
hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
Nell'esempio precedente, non viene fornito alcun modello, quindi verrà stampato l'intero file.
Ora stampa tutte le righe che corrispondono al modello "sales":
awk '/sales/ {print}' contents.txt
Questo stamperà tutte le righe che contengono la parola "vendite" come mostrato di seguito:
hitesh engineer sales 30000
bhavesh engineer sales 30000
rajesh directory sales 40000
deep clerk sales 20000
Variabili in AWK
AWK viene fornito con alcune variabili integrate che vengono utilizzate per suddividere una riga di testo in singole parole o parti chiamate campi. Alcuni di essi sono mostrati di seguito:
• $0 :Usato per l'intera linea.
• $1 :Usato per il primo campo.
• $2 :Usato per il secondo campo.
• $n :utilizzato per l'ennesimo campo.
• NR :utilizzato per specificare il numero totale di record correnti.
• NF :Usato per specificare il numero totale di campi nel record.
• FS :contiene il carattere separatore di campo e viene utilizzato per dividere i campi sulla riga di input.
• RS :Memorizza il carattere separatore del record corrente.
• OFS :Memorizza il separatore del campo di output e viene utilizzato per separare i campi quando Awk li stampa.
• ORS :memorizza il separatore del record di output e viene utilizzato per separare le righe di output quando Awk le stampa.
Ora, stampa i campi n. 1 e 3 dal file content.txt usando la seguente sintassi:
awk '{print $1,$3}' contents.txt
Dovresti vedere solo il primo e il terzo campo del file content.txt:
hitesh sales
jayesh account
vyom purchase
bhavesh sales
rajesh sales
niraj account
jay purchase
deep sales
Puoi usare NR con il comando AWK per stampare tutte le righe insieme al numero di riga:
awk '{print NR,$0}' contents.txt
Uscita:
1 hitesh engineer sales 30000
2 jayesh director account 25000
3 vyom manager purchase 20000
4 bhavesh engineer sales 30000
5 rajesh directory sales 40000
6 niraj clerk account 20000
7 jay peon purchase 23000
8 deep clerk sales 20000
Puoi usare NF per visualizzare l'ultimo campo e $1 per visualizzare il primo campo:
awk '{print $1,$NF}' contents.txt
Questo stamperà il primo e l'ultimo campo del file content.txt:
hitesh 30000
jayesh 25000
vyom 20000
bhavesh 30000
rajesh 40000
niraj 20000
jay 23000
deep 20000
Per stampare il numero di riga da 2 a 5 utilizzare la variabile NR come mostrato di seguito:
awk 'NR==2, NR==5 {print NR,$0}' contents.txt
Uscita:
2 jayesh director account 25000
3 vyom manager purchase 20000
4 bhavesh engineer sales 30000
5 rajesh directory sales 40000
Per contare il numero delle righe nel file content.txt usando NR:
awk 'END { print NR } ' contents.txt
Dovresti vedere il seguente output:
8
Blocchi INIZIO e FINE
Esistono anche blocchi BEGIN e END opzionali che possono contenere comandi da eseguire rispettivamente prima e dopo l'elaborazione del file. Il blocco BEGIN viene utilizzato per eseguire azioni prima dell'elaborazione dei record mentre il blocco END viene utilizzato per eseguire azioni dopo l'elaborazione dei record.
La sintassi di base per utilizzare i blocchi BEGIN e END con il comando AWK è mostrata di seguito:
awk 'BEGIN { action; } /search/ { action; } END { action; }' input_file
Puoi stampare le informazioni sui campi che stai stampando con i blocchi BEGIN e END.
L'esempio seguente stamperà il messaggio prima e dopo l'elaborazione del secondo campo di ogni record nel file content.txt:
awk 'BEGIN { print "Start Process." }; { print $2 }; END { print "End Process." }' contents.txt
Uscita:
Start Process.
engineer
director
manager
engineer
directory
clerk
peon
clerk
End Process.
Puoi anche utilizzare i blocchi BEGIN e END per trasformare i dati dal file e convertirli in una tabella. L'esempio seguente converte il file /etc/passwd in una tabella:
awk 'BEGIN { FS=":"; print "User\t\tUID\t\tGID\t\tHome\t\tShell\n--------------"; } {print $1,"\t\t",$3,"\t\t",$4,"\t\t",$6,"\t\t",$7;} END { print "---------\nFile Complete" }' /etc/passwd
Uscita:
User UID GID Home Shell
--------------
root 0 0 /root /bin/bash
daemon 1 1 /usr/sbin /usr/sbin/nologin
bin 2 2 /bin /usr/sbin/nologin
sys 3 3 /dev /usr/sbin/nologin
sync 4 65534 /bin /bin/sync
games 5 60 /usr/games /usr/sbin/nologin
man 6 12 /var/cache/man /usr/sbin/nologin
lp 7 7 /var/spool/lpd /usr/sbin/nologin
mail 8 8 /var/mail /usr/sbin/nologin
news 9 9 /var/spool/news /usr/sbin/nologin
uucp 10 10 /var/spool/uucp /usr/sbin/nologin
proxy 13 13 /bin /usr/sbin/nologin
www-data 33 33 /var/www /usr/sbin/nologin
---------
File Complete
Ricerca condizionale
Il comando AWK supporta anche diverse istruzioni condizionali tra cui, if, ciclo while, ciclo for e molti altri. Questo ti aiuterà a recuperare le righe che corrispondono a una condizione specifica.
L'esempio seguente utilizzerà la condizione "se" per stampare tutte le righe che contengono "vendite" nel terzo campo:
awk '{ if ($3 ~ /sales/) print}' contents.txt
Uscita:
hitesh engineer sales 30000
bhavesh engineer sales 30000
rajesh directory sales 40000
deep clerk sales 20000
L'esempio seguente utilizzerà il ciclo "for" per stampare i primi tre campi di ogni record, uno per riga.
awk '{ for (i = 1; i <= 3; i++) print $i }' contents.txt
Uscita:
hitesh
engineer
sales
jayesh
director
account
vyom
manager
purchase
bhavesh
engineer
sales
rajesh
directory
sales
niraj
clerk
account
jay
peon
purchase
deep
clerk
sales
L'esempio seguente utilizzerà il ciclo "while" per stampare i primi due campi di ogni record, uno per riga.
awk '{ i = 1; while ( i <= 2 ) { print $i i++ } }' contents.txt
Uscita:
hitesh1
engineer2
jayesh1
director2
vyom1
manager2
bhavesh1
engineer2
rajesh1
directory2
niraj1
clerk2
jay1
peon2
deep1
clerk2
Elaborazione dell'output da altri comandi
Puoi anche utilizzare il comando AWK per analizzare l'output dell'altro comando invece di specificare un nome file. Il comando "ip a" stampa le informazioni sull'IP del sistema, l'indirizzo Mac e altre informazioni relative alla rete come mostrato di seguito:
ip a s wlan0
Uscita:
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 4c:bb:58:9c:f5:55 brd ff:ff:ff:ff:ff:ff
inet 172.20.10.3/28 brd 172.20.10.15 scope global wlan0
valid_lft forever preferred_lft forever
inet6 2401:4900:1d71:ef26:8846:95b2:4ca8:aa7d/64 scope global temporary dynamic
valid_lft 600574sec preferred_lft 81574sec
inet6 2401:4900:1d71:ef26:4ebb:58ff:fe9c:f555/64 scope global dynamic
valid_lft forever preferred_lft forever
inet6 fe80::4ebb:58ff:fe9c:f555/64 scope link
valid_lft forever preferred_lft forever
Ora puoi utilizzare il comando AWK per stampare solo l'indirizzo IP del sistema come mostrato di seguito:
ip a s wlan0 | awk -F '[\/ ]+' '/inet / {print $3}
Dovresti vedere il seguente output:
172.20.10.3
Esempi di avanzamento dei comandi AWK
Esempio 1: Il comando AWK consente di stampare le righe con un certo numero di caratteri specificato. Ad esempio, stampa righe con più di 27 caratteri, utilizza il comando seguente:
awk 'length($0) > 27' contents.txt
Uscita:
jayesh director account 25000
bhavesh engineer sales 30000
rajesh directory sales 40000
Esempio 2: Controlla il cubo del numero dato
Per stampare il cubo del numero specificato fino a 5, eseguire il comando seguente:
awk 'BEGIN { for(i=1; i<=5; i++) print "Cube of",i,"is",i*i*i; }'
Uscita:
Cube of 1 is 1
Cube of 2 is 8
Cube of 3 is 27
Cube of 4 is 64
Cube of 5 is 125
Esempio 3: Conta il numero di righe nel file specificato
Puoi controllare il numero di righe nel file specificato e stamparlo usando il seguente comando:
awk 'END { print NR }' contents.txt
Uscita:
8
Esempio 4: Trova la riga più lunga nel file specificato e stampa il carattere
Puoi trovare la riga più lunga nel file specificato e stampare il carattere di quella riga usando il seguente comando:
awk '{ if (length($0) > max) max = length($0) } END { print max }' contents.txt
Uscita
29
Esempio 5: Ordina la prima colonna di un determinato file
Per ordinare e stampare la prima colonna del file content.txt, eseguire il comando seguente:
awk -F: '{ print $1 }' contents.txt | sort
Uscita:
bhavesh engineer sales 30000
deep clerk sales 20000
hitesh engineer sales 30000
jayesh director account 25000
jay peon purchase 23000
niraj clerk account 20000
rajesh directory sales 40000
vyom manager purchase 20000
Esempio 6: Stampa le righe pari
Per stampare solo righe pari nel file content.txt, eseguire il comando seguente:
awk 'NR % 2 == 0' contents.txt
Uscita:
jayesh director account 25000
bhavesh engineer sales 30000
niraj clerk account 20000
deep clerk sales 20000
Esempio 7: Cambia il separatore di campo
È possibile modificare il separatore archiviato da spazio a | e stampalo con il seguente comando:
awk 'BEGIN{OFS="|"}{print $1,$2,$3,$4}' contents.txt
Uscita:
hitesh|engineer|sales|30000
jayesh|director|account|25000
vyom|manager|purchase|20000
bhavesh|engineer|sales|30000
rajesh|directory|sales|40000
niraj|clerk|account|20000
jay|peon|purchase|23000
deep|clerk|sales|20000
Conclusione
In questo tutorial, hai appreso come utilizzare il comando AWK per abbinare i modelli specificati e quindi eseguire le azioni associate. Spero che tu abbia un'idea chiara di come utilizzare il comando AWK per manipolare, formattare e stampare selettivamente file di testo.