GNU/Linux >> Znalost Linux >  >> Linux

Příkaz awk v Linuxu

AWK je jedním z nejvýkonnějších příkazů v Linuxu. Pomocí příkazu awk můžete spravovat data a generovat sestavy. Umožňuje nám také používat logické operace, proměnné, tiskové funkce a mnoho dalších. AWK znamená „Aho, Weinberger a Kernighan“ a většinou se používá pro skenování a zpracování vzorů. Prohledá jeden nebo více souborů, aby zjistil, zda obsahují řádky, které odpovídají zadanému vzoru, a poté provede související akce. Čte ze souboru nebo z jeho standardního vstupu a výstupy na standardní výstup. Pro každý řádek se shoduje s daným vzorem v daném pořadí, pokud shody provedou odpovídající akci.

Funkce

• Zobrazí textový soubor jako záznamy a pole
• Má proměnné, podmínky a smyčky
• Má aritmetické a řetězcové operátory
• Může generovat formátované zprávy
• Číst a upravovat text z řetězce nebo souboru

V tomto tutoriálu se podíváme na příkaz AWK Linux s příklady a uvidíme, co umí.

Základní syntaxe AWK

Základní syntaxe příkazu AWK je uvedena níže:

awk options program input-file

Stručné vysvětlení každé možnosti je uvedeno níže:

• -F fs :Používá se k určení oddělovače souborů.
• -f soubor :Používá se k určení souboru, který obsahuje skript awk.
• -v var=hodnota :Používá se k deklaraci proměnné.

Následující textový soubor použijeme jako vstupní soubor pro všechny příklady v tomto článku:

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

Nyní zkontrolujeme obsah souboru s názvem 'contents.txt' pomocí příkazu AWK:

awk '{print}' contents.txt

Tím se vytiskne obsah souboru, jak je znázorněno níže:

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

Ve výše uvedeném příkladu není zadán žádný vzor, ​​takže se vytiskne celý soubor.

Nyní vytiskněte všechny řádky, které odpovídají vzoru „prodej“:

awk '/sales/ {print}' contents.txt

Tím se vytisknou všechny řádky, které obsahují slovo „prodej“, jak je uvedeno níže:

hitesh engineer sales 30000
bhavesh engineer sales 30000
rajesh directory sales 40000
deep clerk sales 20000

Proměnné v AWK

AWK přichází s některými vestavěnými proměnnými, které se používají k rozdělení řádku textu na jednotlivá slova nebo části nazývané pole. Některé z nich jsou uvedeny níže:

• $0 :Používá se pro celý řádek.
• $1 :Používá se pro první pole.
• $2 :Používá se pro druhé pole.
• $n :Používá se pro n-té pole.
• NR :Používá se k určení celkového počtu aktuálních záznamů.
• NF :Používá se k určení celkového počtu polí v záznamu.
• FS :Obsahuje znak oddělovače polí a používá se k rozdělení polí na vstupním řádku.
• RS :Ukládá aktuální znak oddělovače záznamu.
• OFS :Ukládá oddělovač výstupních polí a používá se k oddělení polí, když je Awk vytiskne.
• ORS:Ukládá oddělovač výstupních záznamů a používá se k oddělení výstupních řádků, když je Awk vytiskne.

Nyní vytiskněte pole č. 1 a 3 ze souboru content.txt pomocí následující syntaxe:

awk '{print $1,$3}' contents.txt

Měli byste vidět pouze první a třetí pole souboru content.txt:

hitesh sales
jayesh account
vyom purchase
bhavesh sales
rajesh sales
niraj account
jay purchase
deep sales

Můžete použít NR s příkazem AWK k vytištění všech řádků spolu s číslem řádku:

awk '{print NR,$0}' contents.txt

Výstup:

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

Můžete použít NF pro zobrazení posledního pole a $1 pro zobrazení prvního pole:

awk '{print $1,$NF}' contents.txt

Tím se vytiskne první a poslední pole souboru content.txt:

hitesh 30000
jayesh 25000
vyom 20000
bhavesh 30000
rajesh 40000
niraj 20000
jay 23000
deep 20000

Chcete-li vytisknout číslo řádku od 2 do 5, použijte proměnnou NR, jak je uvedeno níže:

awk 'NR==2, NR==5 {print NR,$0}' contents.txt

Výstup:

2 jayesh director account 25000
3 vyom manager purchase 20000
4 bhavesh engineer sales 30000
5 rajesh directory sales 40000

Chcete-li spočítat počet řádků v souboru content.txt pomocí NR:

awk 'END { print NR } ' contents.txt

Měli byste vidět následující výstup:

8

Začátek a konec bloků

Existují také volitelné bloky BEGIN a END, které mohou obsahovat příkazy k provedení před a po zpracování souboru. Blok BEGIN se používá k provádění akcí před zpracováním záznamů, zatímco blok END se používá k provádění akcí po zpracování záznamů.

Základní syntaxe pro použití bloků BEGIN a END s příkazem AWK je uvedena níže:

awk 'BEGIN { action; } /search/ { action; } END { action; }' input_file

Informace o polích, která tisknete, můžete vytisknout pomocí bloků BEGIN a END.
Následující příklad vytiskne zprávu před a po zpracování druhého pole každého záznamu v souboru content.txt:

awk 'BEGIN { print "Start Process." }; { print $2 }; END { print "End Process." }' contents.txt

Výstup:

Start Process.
engineer
director
manager
engineer
directory
clerk
peon
clerk
End Process.

Můžete také použít bloky BEGIN a END k transformaci dat ze souboru a převedení na tabulku. Následující příklad převede soubor /etc/passwd do tabulky:

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

Výstup:

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

Podmíněné vyhledávání

Příkaz AWK také podporuje několik podmíněných příkazů včetně smyčky if, while, smyčky for a mnoha dalších. To vám pomůže načíst řádky, které odpovídají konkrétní podmínce.

Následující příklad použije podmínku "if" k vytištění všech řádků, které obsahují "prodej" ve třetím poli:

awk '{ if ($3 ~ /sales/) print}' contents.txt

Výstup:

hitesh engineer sales 30000
bhavesh engineer sales 30000
rajesh directory sales 40000
deep clerk sales 20000

Následující příklad použije smyčku "for" k vytištění prvních tří polí každého záznamu, jedno na řádek.

awk '{ for (i = 1; i <= 3; i++) print $i }' contents.txt

Výstup:

hitesh
engineer
sales
jayesh
director
account
vyom
manager
purchase
bhavesh
engineer
sales
rajesh
directory
sales
niraj
clerk
account
jay
peon
purchase
deep
clerk
sales

Následující příklad použije smyčku "while" k vytištění prvních dvou polí každého záznamu, jedno na řádek.

awk '{ i = 1;  while ( i <= 2 ) {  print $i i++ } }' contents.txt

Výstup:

hitesh1
engineer2
jayesh1
director2
vyom1
manager2
bhavesh1
engineer2
rajesh1
directory2
niraj1
clerk2
jay1
peon2
deep1
clerk2

Zpracování výstupu z jiných příkazů

Můžete také použít příkaz AWK k analýze výstupu z jiného příkazu namísto zadání názvu souboru. Příkaz "ip a" vytiskne informace o IP systému, adrese Mac a dalších informacích souvisejících se sítí, jak je uvedeno níže:

ip a s wlan0

Výstup:

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

Nyní můžete pomocí příkazu AWK vytisknout pouze IP adresu systému, jak je znázorněno níže:

ip a s wlan0 | awk -F '[\/ ]+' '/inet / {print $3}

Měli byste vidět následující výstup:

172.20.10.3

Příklady rozšíření příkazu AWK

Příklad 1: Příkaz AWK umožňuje vytisknout řádky s určitým zadaným počtem znaků. Například pro tisk řádků s více než 27 znaky použijte níže uvedený příkaz:

awk 'length($0) > 27' contents.txt

Výstup:

jayesh director account 25000
bhavesh engineer sales 30000
rajesh directory sales 40000

Příklad 2: Zkontrolujte kostku daného čísla

Chcete-li vytisknout kostku daného čísla do 5, spusťte následující příkaz:

awk 'BEGIN { for(i=1; i<=5; i++) print "Cube of",i,"is",i*i*i; }'

Výstup:

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

Příklad 3: Spočítejte počet řádků v zadaném souboru

Počet řádků v zadaném souboru můžete zkontrolovat a vytisknout pomocí následujícího příkazu:

awk 'END { print NR }' contents.txt

Výstup:

8

Příklad 4: Najděte nejdelší řádek v daném souboru a vytiskněte znak

Můžete najít nejdelší řádek v daném souboru a vytisknout znak tohoto řádku pomocí následujícího příkazu:

awk '{ if (length($0) > max) max = length($0) } END { print max }' contents.txt

Výstup

29

Příklad 5: Seřadit první sloupec daného souboru

Chcete-li seřadit a vytisknout první sloupec souboru content.txt, spusťte následující příkaz:

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

Výstup:

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

Příklad 6: Vytiskněte sudé řádky

Chcete-li vytisknout pouze sudé řádky v souboru content.txt, spusťte následující příkaz:

awk 'NR % 2 == 0' contents.txt

Výstup:

jayesh director account 25000
bhavesh engineer sales 30000
niraj clerk account 20000
deep clerk sales 20000

Příklad 7: Změňte oddělovač pole

Můžete změnit oddělovač pole z mezery na | a vytiskněte jej pomocí následujícího příkazu:

awk 'BEGIN{OFS="|"}{print $1,$2,$3,$4}' contents.txt

Výstup:

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

Závěr

V tomto kurzu jste se naučili, jak používat příkaz AWK ke spárování zadaných vzorů a poté provádět související akce. Doufám, že máte jasnou představu o tom, jak používat příkaz AWK k manipulaci, formátování a selektivnímu tisku textových souborů.


Linux
  1. Linuxový příkaz mv

  2. Linux du command

  3. Linuxový ip příkaz

  1. Příkaz AWK v Linuxu s příklady

  2. Linux cd příkaz

  3. Příklady příkazů awk v Linuxu

  1. Linux příkaz ifconfig

  2. Linux Time Command

  3. Příkaz Ping v Linuxu