GNU/Linux >> Linux Esercitazione >  >> Linux

Comando Awk in Linux

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.


Linux
  1. Comando Linux mv

  2. Linux du comando

  3. comando IP Linux

  4. comando cd di Linux

  5. Esempi di comandi awk in Linux

Linux quale comando

Comando W in Linux

Al comando in Linux

Comando awk di Linux con 10 esempi

Comando Df in Linux

Comando AWK in Linux/Unix