Ako písať skripty pomocou programovacieho jazyka Awk?
Awk je výkonný jazyk na spracovanie textu pomenovaný po svojich troch pôvodných autoroch: Alfred Aho, Peter Weinberger a Brian Kernighan. Je to všestranný jazyk, ktorý sa primárne používa na skenovanie a spracovanie vzorov. Awk je základom unixového skriptovania a bežne sa používa na úlohy, ako je extrakcia údajov, vytváranie správ a transformácia údajov.
Skripty Awk sa rýchlo píšu a dobre fungujú pri malých až stredne veľkých úlohách. V tomto článku vám predstavíme základy písania skriptov pomocou programovacieho jazyka Awk.
Základná syntax
Program Awk pozostáva zo sekvencie párov vzor-akcia, zapísaných ako −
pattern { action }
Tu je vzor podmienkou. Ak sa vstupný riadok zhoduje so vzorom, vykoná sa akcia.
Napríklad -
awk '/search_pattern/ { print $0 }' file_name
V tomto príklade awk vyhľadá riadok, ktorý obsahuje search_pattern z file_name, a ak sa zhoduje, vytlačí celý riadok ($0).
Používanie premenných
Awk má vstavané premenné, ktoré môžete použiť na formátovanie výstupu. Niektoré z najbežnejších sú -
0 $ − Celý riadok.
$1, $2, ... − Každé jednotlivé pole (predvolene oddelené medzerou).
FS − Oddeľovač polí (predvolene je medzera).
OFS − Výstupný oddeľovač polí (predvolene je medzera).
NR − Počet spracovaných záznamov.
NF − Počet polí v aktuálnom zázname.
Pozrime sa na praktický príklad s použitím niektorých z týchto premenných. Predpokladajme, že máme textový súbor s názvom 'students.txt' s nasledujúcim obsahom −
John Doe 18
Jane Smith 19
Môžeme použiť awk na samostatné vytlačenie mien a veku −
awk '{ print "Name: " $1 " " $2 ", Age: " $3 }' students.txt
Výstup bude -
Name: John Doe, Age: 18
Name: Jane Smith, Age: 19
Riadenie toku
Awk tiež podporuje bežné mechanizmy toku riadenia ako if, else, while a for. Tu je príklad použitia if a else −
awk '{ if ($3 > 18) print $1 " is an adult"; else print $1 " is a minor"}' students.txt
Výstup bude -
John is an adult
Jane is a minor
Funkcie
Awk má okrem iného vstavané funkcie na manipuláciu s reťazcami, aritmetické operácie a vstup/výstup. Môžete tiež definovať svoje vlastné funkcie.
Tu je príklad užívateľom definovanej funkcie, ktorá prevádza teploty z Fahrenheita na Celzia −
function toCelsius(fahrenheit) {
return (fahrenheit - 32) * 5/9
}
BEGIN { print "Fahrenheit Celsius" }
{ print $1, toCelsius($1) }
Ak máme vstupný súbor 'temperatures.txt' s teplotami Fahrenheita −
32
212
Výstup bude -
Fahrenheit Celsius
32 0
212 100
Regulárne výrazy
Awk podporuje syntax regulárneho výrazu, ktorý možno použiť pri porovnávaní vzorov. Tu je základný príklad, keď v našom súbore „students.txt“ hľadáme riadky, ktoré začínajú písmenom „J“ −
awk '/^J/ { print $0 }' students.txt
V tomto prípade symbol vsuvky (^) predstavuje začiatok riadku. Tento skript vypíše −
John Doe 18
Jane Smith 19
Polia
Awk podporuje jednorozmerné polia, ktoré možno použiť na zložitejšiu manipuláciu s údajmi. Uvažujme o prípade, keď chceme počítať výskyt veku v našom súbore 'students.txt'. Tu je návod, ako to môžete urobiť −
awk '{ count[$3]++ } END { for (age in count) print age " appears " count[age] " times." }' students.txt
Výsledkom bude −
18 appears 1 times.
19 appears 1 times.
V tomto skripte count[$3]++ používa vek (tretie pole) ako kľúč poľa a zvyšuje jeho hodnotu vždy, keď sa objaví.
Pokročilá manipulácia s údajmi
Awk tiež poskytuje niekoľko vstavaných funkcií pre pokročilejšiu manipuláciu s údajmi. Poskytuje napríklad funkciu split(), ktorá dokáže rozdeliť reťazec do poľa −
awk '{ split($1, array, ""); print "First letter of the name: " array[1] }' students.txt
Tento skript vypíše −
First letter of the name: J
First letter of the name: J
Kombinácia Awk s inými príkazmi Unix
Skripty Awk môžete kombinovať s inými príkazmi Unixu pomocou rúrok (|), čo z nich robí ešte výkonnejší nástroj −
cat students.txt | awk '{ print $1 }' | sort | uniq
Tento príkaz vytlačí krstné mená študentov, zoradí ich a potom odstráni všetky duplikáty. V tomto prípade bude výstup −
Jane
John
Používanie skriptov v Awk
Zatiaľ čo používanie Awk priamo v termináli je bežné pri jednoduchých úlohách, pri zložitejších operáciách môže byť pohodlnejšie písať skripty. Skripty Awk majú rovnakú štruktúru vzor-akcia, ale sú napísané v samostatnom súbore.
Najprv vytvorte nový súbor s príponou .awk. Horný riadok skriptu by mal byť riadok shebang, ktorý ukazuje na interpret Awk −
#!/usr/bin/awk -f
Vytvorme skript Awk s názvom „students.awk“, ktorý vypočíta priemerný vek študentov −
#!/usr/bin/awk -f
BEGIN {
sum = 0
count = 0
}
{
sum += $3
count++
}
END {
print "Average age: " sum/count
}
Ak chcete skript spustiť, urobte ho spustiteľným pomocou príkazu chmod +x students.awk a potom ho spustite pomocou súboru ./students.awk students.txt. Toto vytlačí −
Average age: 18.5
Ladenie skriptov Awk
Ladenie skriptov Awk môže byť trochu zložité kvôli nedostatku vstavaných nástrojov na ladenie. Avšak použitie tlačových príkazov na zobrazenie hodnoty premenných v rôznych bodoch skriptu môže byť užitočné.
Voľbu -W dump-variables[=súbor] možno použiť aj na výpis všetkých premenných a polí do súboru na ladenie. Ak chcete použiť túto možnosť, spustite awk -W dump-variables=dump.txt script.awk.
Pokročilé priraďovanie vzorov
Awk tiež podporuje pokročilé porovnávanie vzorov s regulárnymi výrazmi. Operátor ~ môžete napríklad použiť na priradenie poľa k regulárnemu výrazu.
Predstavte si súbor students.txt s dodatočným poľom pre kurz, ktorý študujú −
John Doe 18 ComputerScience
Jane Smith 19 Mathematics
Ak chcete nájsť študentov študujúcich informatiku, môžete napísať −
awk '$4 ~ /ComputerScience/ { print $1 " " $2 " is studying Computer Science." }' students.txt
Výsledkom bude −
John Doe is studying Computer Science.
Záver
Awk je výkonný nástroj na spracovanie textu na systémoch založených na Unixe. Jeho sila spočíva v jeho jednoduchosti a priamočiarosti jeho syntaxe. Či už pracujete s textom alebo vykonávate aritmetické výpočty, Awk je vynikajúci nástroj, ktorý môžete mať vo svojej súprave programovacích nástrojov.
Pamätajte, že najlepší spôsob, ako sa naučiť Awk (alebo akýkoľvek jazyk), je používať ho. Skúste si vytvoriť vlastné Awk skripty, začnite s jednoduchými úlohami a postupne prejdite na zložitejšie, keď sa budete s jazykom viac orientovať.