Awk je jedním z nejstarších nástrojů v sadě nástrojů uživatelů Unixu a Linuxu. Awk, vytvořený v 70. letech 20. století Alfredem Ahom, Peterem Weinbergerem a Brianem Kernighanem (A, W a K názvu nástroje), byl vytvořen pro komplexní zpracování textových proudů. Je to doprovodný nástroj k sed, editor streamu, který je určen pro zpracování textových souborů po řádcích. Awk umožňuje složitější strukturované programy a je kompletním programovacím jazykem.
Tento článek vysvětlí, jak používat awk pro strukturovanější a složitější úkoly, včetně jednoduché aplikace hromadné korespondence.
Struktura programu Awk
Skript awk se skládá z funkčních bloků obklopených {} (složené závorky). Existují dva speciální funkční bloky, BEGIN a KONEC , které se provádějí před zpracováním prvního řádku vstupního toku a po zpracování posledního řádku. Mezi tím mají bloky formát:
pattern { action statements }
Každý blok se provede, když řádek ve vstupní vyrovnávací paměti odpovídá vzoru. Pokud není zahrnut žádný vzor, funkční blok se provede na každém řádku vstupního proudu.
K definování funkcí v awk, které lze volat z libovolného bloku, lze také použít následující syntaxi:
function name(parameter list) { statements }
Tato kombinace bloků a funkcí pro porovnávání vzorů umožňuje vývojářům strukturovat programy awk pro opětovné použití a čitelnost.
Jak awk zpracovává textové streamy
Awk čte text ze svého vstupního souboru nebo streamu jeden řádek po druhém a používá oddělovač polí k jeho analýze do několika polí. V terminologii awk je aktuální vyrovnávací paměť záznam . Existuje řada speciálních proměnných, které ovlivňují, jak awk čte a zpracovává soubor:
- FS (oddělovač polí):Ve výchozím nastavení se jedná o jakékoli mezery (mezery nebo tabulátory)
- RS (oddělovač záznamů):Ve výchozím nastavení je nový řádek (\n )
- NF (počet polí):Když awk analyzuje řádek, tato proměnná je nastavena na počet polí, která byla analyzována
- 0 $: Aktuální rekord
- 1 $, 2 $, 3 $ atd.: První, druhé, třetí atd. pole z aktuálního záznamu
- NR (počet záznamů):Počet záznamů, které byly dosud analyzovány skriptem awk
Existuje mnoho dalších proměnných, které ovlivňují chování awk, ale pro začátek to stačí.
Jednoduchy Awk
U tak silného nástroje je zajímavé, že většina použití awk jsou základní jednolinky. Snad nejběžnější program awk tiskne vybraná pole ze vstupního řádku ze souboru CSV, souboru protokolu atd. Například následující jednořádkový řádek vytiskne seznam uživatelských jmen z /etc/passwd :
awk -F":" '{print $1 }' /etc/passwd
Jak je uvedeno výše, 1 $ je první pole v aktuálním záznamu. -F volba nastaví proměnnou FS na znak : .
Oddělovač polí lze také nastavit ve funkčním bloku BEGIN:
awk 'BEGIN { FS=":" } {print $1 }' /etc/passwd
V následujícím příkladu každý uživatel, jehož shell není /sbin/nologin lze vytisknout předřazením bloku se vzorem:
awk 'BEGIN { FS=":" } ! /\/sbin\/nologin/ {print $1 }' /etc/passwd
Pokročilé awk:Hromadná korespondence
Nyní, když máte nějaké základy, zkuste se ponořit hlouběji do awk na strukturovanějším příkladu:vytvoření hromadné korespondence.
Hromadná korespondence používá dva soubory, jeden (v tomto příkladu nazvaný email_template.txt ) obsahující šablonu e-mailu, který chcete odeslat:
Od:Programový výbor
Komu:{firstname} {lastname} <{email}>
Předmět:Váš návrh prezentace
Vážený { firstname},
Děkujeme za váš návrh prezentace:
{title}
S potěšením vám oznamujeme, že váš návrh byl úspěšný!
Brzy vás budeme kontaktovat s dalšími informacemi o
plánu akce.
Děkujeme,
Programový výbor
Druhým je soubor CSV (nazývaný proposals.csv ) s lidmi, kterým chcete poslat e-mail:
jméno,příjmení,e-mail,titul
Harry,Potter,[email protected],"Poražení svého nepřítele ve 3 snadných krocích"
Jack,Reacher,[email protected],"Hand- boj proti sobě pro začátečníky"
Mickey,Mouse,[email protected],"Přežití veřejného mluvení se skřípavým hlasem"
Santa,Claus,[email protected],"Efektivní tvorba seznamů"
Chcete si přečíst soubor CSV, nahradit příslušná pole v prvním souboru (přeskočit první řádek) a poté zapsat výsledek do souboru s názvem acceptanceN.txt , zvyšuje se N pro každý řádek, který analyzujete.
Napište program awk do souboru s názvem mail_merge.awk . Příkazy jsou odděleny ; ve skriptech awk. Prvním úkolem je nastavit proměnnou oddělovače polí a několik dalších proměnných, které skript potřebuje. Musíte si také přečíst a zahodit první řádek v CSV, jinak se vytvoří soubor začínající na Vážený křestní jméno . K tomu použijte speciální funkci getline a po přečtení vynulujte čítač záznamů na 0.
BEGIN {
FS=",";
template="email_template.txt";
output="acceptance";
getline;
NR=0;
}
Hlavní funkce je velmi přímočará:pro každý zpracovaný řádek je pro různá pole nastavena proměnná — křestní jméno , příjmení , e-mail a název . Soubor šablony se čte řádek po řádku a funkce sub se používá k nahrazení jakéhokoli výskytu sekvencí speciálních znaků hodnotou příslušné proměnné. Poté je řádek s případnými substitucemi převeden do výstupního souboru.
Protože máte co do činění se souborem šablony a jiným výstupním souborem pro každý řádek, musíte před zpracováním dalšího záznamu vyčistit a zavřít popisovače souborů pro tyto soubory.
{
# Číst relevantní pole ze vstupního souboru
jméno=$1;
příjmení=2$;
email=3$;
název=4$;
# Nastavit výstupní název souboru
outfile=(výstup NR ".txt");
# Přečíst řádek ze šablony, nahradit speciální pole a
# vytisknout výsledek do výstupního souboru
while ( (getline ln <šablona)> 0 )
{
sub(/{firstname}/,firstname,ln);
( { }/,příjmení,ln);
sub(/{email}/,e-mail,ln);
sub(/{title}/,title,ln);
n) tisknout> outfile;
}
# Zavřít šablonu a výstupní soubor před dalším záznamem
close(outfile);
close(template);
}
Jsi hotový! Spusťte skript na příkazovém řádku pomocí:
awk -f mail_merge.awk proposals.csv
nebo
awk -f mail_merge.awk < proposals.csv
a najdete textové soubory vygenerované v aktuálním adresáři.
Pokročilé awk:Počet slov
Jednou z nejvýkonnějších funkcí v awk je asociativní pole. Ve většině programovacích jazyků jsou položky pole obvykle indexovány číslem, ale v awk se na pole odkazuje řetězec klíče. Můžete uložit záznam ze souboru proposals.txt z předchozí části. Například v jediném asociativním poli, jako je toto:
navrhovatel["křestní jméno"]=$1;
navrhovatel["příjmení"]=$2;
navrhovatel["e-mail"]=3$;
navrhovatel["title"]=4 $;
Díky tomu je zpracování textu velmi snadné. Jednoduchý program, který používá tento koncept, je myšlenka čítače frekvence slov. Můžete analyzovat soubor, oddělit slova (ignorovat interpunkci) v každém řádku, zvýšit počítadlo pro každé slovo v řádku a poté vytisknout 20 nejlepších slov, která se vyskytují v textu.
Nejprve v souboru s názvem wordcount.awk , nastavte oddělovač polí na regulární výraz, který obsahuje mezery a interpunkci:
BEGIN {
# ignorovat 1 nebo více po sobě jdoucích výskytů znaků
# ve skupině znaků níže
FS="[ .,:;()<>{}@!\ "'\t]+";
}
Dále bude funkce hlavní smyčky opakovat každé pole, ignorovat všechna prázdná pole (což se stane, pokud je na konci řádku interpunkce) a zvýší počet slov pro slova v řádku.
{
for (i =1; i <=NF; i++) {
if ($i !="") {
slova[$i]++;
}
}
}
Nakonec, až bude text zpracován, použijte funkci END k vytištění obsahu pole, poté použijte schopnost awk propojit výstup do příkazu shellu k provedení číselného řazení a vytištění 20 nejčastěji se vyskytujících slov:
END {
sort_head ="sort -k2 -nr | head -n 20";
for (slovo ve slovech) {
printf "%s\t%d\n" , slovo, slova [slovo] | sort_head;
}
close (sort_head);
}
Spuštěním tohoto skriptu na dřívější verzi tohoto článku vznikl tento výstup:
[[email protected]]$ awk -f wordcount.awkthe 79
awk 41
a 39
a 33
z 32
v 27
do 26
je 25
řádek 23
pro 23
bude /> file 22
my 16
My 15
s 12
což 12
podle 12
toto 11
výstup 11
funkce 1 /před>Co bude dál?
Další zdroje pro Linux
- Cheat pro příkazy Linuxu
- Cheat sheet pro pokročilé příkazy systému Linux
- Bezplatný online kurz:Technický přehled RHEL
- Síťový cheat pro Linux
- Cheat sheet SELinux
- Cheat pro běžné příkazy pro Linux
- Co jsou kontejnery systému Linux?
- Naše nejnovější články o Linuxu
Pokud se chcete o programování awk dozvědět více, důrazně doporučuji knihu Sed and awk od Dalea Doughertyho a Arnolda Robbinse.
Jedním z klíčů k pokroku v programování awk je zvládnutí „rozšířených regulárních výrazů“. Awk nabízí několik výkonných doplňků k syntaxi regulárního výrazu sed, kterou již možná znáte.
Dalším skvělým zdrojem pro učení awk je uživatelská příručka GNU awk. Obsahuje úplný odkaz na vestavěnou knihovnu funkcí awk a také spoustu příkladů jednoduchých a složitých skriptů awk.