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ů.