Příkaz Awk v Linuxu s příklady

Awk je univerzální skriptovací jazyk určený pro pokročilé zpracování textu. Většinou se používá jako nástroj pro reporting a analýzu.

Na rozdíl od většiny ostatních programovacích jazyků, které jsou procedurální, je awk řízen daty, což znamená, že definujete soubor akcí, které mají být provedeny proti vstupnímu textu. Vezme vstupní data, transformuje je a odešle výsledek na standardní výstup.

tento článek se zabývá základy programovacího jazyka awk., Znalost základů awk výrazně zlepší vaši schopnost manipulovat s textovými soubory na příkazovém řádku.

jak awk funguje #

existuje několik různých implementací awk. Použijeme GNU implementaci awk, která se nazývá gawk. Ve většině linuxových systémů je interpret awk pouze symbolickým odkazem na gawk.

záznamy a pole #

Awk mohou zpracovávat textové datové soubory a streamy. Vstupní data jsou rozdělena na záznamy a pole. Awk pracuje na jednom záznamu najednou, dokud není dosaženo konce vstupu., Záznamy jsou odděleny znakem zvaným oddělovač záznamů. Výchozí oddělovač záznamů je znak newline, což znamená, že každý řádek v textových datech je záznam. Nový oddělovač záznamů lze nastavit pomocí proměnné RS.

záznamy se skládají z polí, která jsou oddělena oddělovačem polí. Ve výchozím nastavení jsou pole oddělena mezerou, včetně jedné nebo více znaků tab, space a newline.

pole v každém záznamu odkazuje znak dolaru ($) následuje číslo pole, počínaje 1., První pole je reprezentováno $1, druhé s $2 a tak dále. Poslední pole lze také označit speciální proměnnou $NF. Na celý záznam lze odkazovat pomocí $0.

Zde je vizuální znázornění ukazuje, jak odkazovat záznamy a pole:

tmpfs 788M 1.8M 786M 1% /run/lock /dev/sda1 234G 191G 31G 87% /|-------| |--| |--| |--| |-| |--------| $1 $2 $3 $4 $5 $6 ($NF) --> fields|-----------------------------------------| $0 --> record

program v jazyce Awk #

zpracovat text s awk, můžete napsat program, který vypráví příkaz, co mám dělat., Program se skládá z řady pravidel a uživatelem definovaných funkcí. Každé pravidlo obsahuje jeden vzor a akční pár. Pravidla jsou oddělena newline nebo semi-colons (;). Typicky, awk program vypadá takto:

pattern { action }pattern { action }...

Když awk zpracování dat, pokud vzor odpovídá záznamu, provede zadané akce na tomto záznamu. Pokud pravidlo nemá žádný vzor, jsou všechny záznamy (řádky) porovnány.

akce awk je uzavřena v závorkách ({}) a skládá se z příkazů., Každé prohlášení určuje operaci, která má být provedena. Akce může mít více než jedno prohlášení oddělené dvojtečkou nebo dvojtečkou (;). Pokud pravidlo nemá žádnou akci, je výchozí pro tisk celého záznamu.

Awk podporuje různé typy příkazů, včetně výrazů,podmíněných, vstupních, výstupních příkazů a dalších. Nejběžnější příkazy awk jsou:

  • exit – zastaví provádění celého programu a ukončí.,
  • next – zastaví zpracování aktuálního záznamu a přesune se na další záznam ve vstupních datech.
  • print – tisk záznamů, polí, proměnných a vlastního textu.
  • printf – poskytuje větší kontrolu nad výstupním formátem, podobně jako C a bash printf.

při psaní programů awk je vše za hash značkou (#) a až do konce řádku je považováno za komentář., Dlouhé řádky lze rozdělit na více řádků pomocí pokračovacího znaku, zpětného lomítka (\).

provádění programů awk #

program awk lze spustit několika způsoby. Pokud je program krátký a jednoduchý, může být předán přímo do interpretu awk na příkazovém řádku:

awk 'program' input-file...

při spuštění programu na příkazovém řádku by měl být uzavřen v jednoduchých uvozovkách (''), takže shell program neinterpretuje.,

Pokud program je velký a složitý, to je nejlepší dát je do souboru a použít -f možnost předat soubor do awk příkaz:

awk -f program-file input-file...

V příkladech níže, budeme používat soubor s názvem „týmy.txt“, který vypadá jako ten níže:

Bucks Milwaukee 60 22 0.732 Raptors Toronto 58 24 0.707 76ers Philadelphia 51 31 0.622Celtics Boston 49 33 0.598Pacers Indiana 48 34 0.585

Awk Patterns #

Patterns in awk control whether the associated action should be executed or not.,

Awk podporuje různé typy vzorů, včetně regulárního výrazu, relation expression, range a special expression patterns.

Když pravidlo nemá žádný vzor, každý vstupní záznam je uzavřeno. Zde je příklad pravidla obsahujícího pouze akci:

awk '{ print $3 }' teams.txt

program vytiskne třetí pole každého záznamu:

6058514948

regulární výraz vzory #

regulární výraz nebo regex je vzor, který odpovídá souboru řetězců., Awk regulární výraz vzorů jsou uzavřeny do lomítek (//):

/regex pattern/ { action }

nejvíce základní příklad je literálový znak nebo řetězec odpovídající. Chcete-li například zobrazit první pole každého záznamu, které obsahuje „0.5“, spusťte následující příkaz:

awk '/0.5/ { print $1 }' teams.txt
CelticsPacers

vzor může být jakýkoli typ rozšířeného regulárního výrazu., Zde je příklad, který vytiskne první pole, pokud záznam začíná dvěma nebo více číslicemi:

awk '/^/ { print $1 }' teams.txt
76ers

relační výrazy vzory #

vzory relačních výrazů se obvykle používají k přizpůsobení obsahu konkrétního pole nebo proměnné.

ve výchozím nastavení jsou vzory regulárních výrazů porovnány se záznamy. Chcete-li porovnat regex s polem, zadejte pole a použijte srovnávací operátor „contain“ (~) proti vzoru.,

například, tisk první pole každého záznamu, jehož druhé pole obsahuje „ia“, zadali byste:

awk '$2 ~ /ia/ { print $1 }' teams.txt
76ersPacers

, Aby odpovídaly pole, které neobsahují daný vzor použít !~ provozovatel:

awk '$2 !~ /ia/ { print $1 }' teams.txt
BucksRaptorsCeltics

můžete porovnat řetězce nebo čísla pro vztahy jako větší než, menší než, rovná, a tak dále., Následující příkaz vytiskne první pole všech záznamů, jejichž třetí pole je větší než 50:

awk '$3 > 50 { print $1 }' teams.txt
BucksRaptors76ers

Range patterns #

Range patterns sestávají ze dvou vzorů oddělených čárkou:

všechny záznamy začínající záznamem, který odpovídá prvnímu vzoru, dokud není porovnán záznam, který odpovídá druhému vzoru.,

zde je příklad, který vytiskne první pole všech záznamů od záznamu včetně “ Raptors „až do záznamu včetně“Celtics“:

awk '/Raptors/,/Celtics/ { print $1 }' teams.txt
Raptors76ersCeltics

vzory mohou být také výrazy relace. Níže uvedený příkaz vytiskne všechny záznamy od toho, jehož čtvrté pole se rovná 32, dokud se čtvrté pole rovná 33:

awk '$4 == 31, $4 == 33 { print $0 }' teams.txt
76ers Philadelphia 51 31 0.622Celtics Boston 49 33 0.598

rozsahové vzory nelze kombinovat s jinými výrazy vzoru.,

Speciální výraz vzory #

Awk obsahuje následující speciální dřeváky:

  • BEGIN – slouží k provedení akce, než jsou záznamy zpracovány.
  • END – Používá se k provádění akcí po zpracování záznamů.

vzorBEGIN se obvykle používá k nastavení proměnných a vzor END pro zpracování dat ze záznamů, jako je výpočet.

následující příklad vytiskne “ zahájit zpracování.“, poté vytiskněte třetí pole každého záznamu a nakonec “ ukončete zpracování.,“:

awk 'BEGIN { print "Start Processing." }; { print $3 }; END { print "End Processing." }' teams.txt
Start Processing6058514948End Processing.

pokud má program pouze BEGIN, akce se provádějí a vstup není zpracován. Pokud má program pouze vzorEND, je vstup zpracován před provedením akcí pravidla.

Gnu verze awk zahrnuje také další dva speciální modely BEGINFILE ENDFILE, který umožňuje provádět akce při zpracování souborů.,

Kombinování vzorů #

Awk umožňuje kombinovat dva nebo více vzorců pomocí logické A operátor (&&) a logické OR operátor (||).,

Zde je příklad, který používá && provozovatel tisk první pole těchto záznam, jehož třetí pole je větší než 50 a čtvrté pole je menší než 30:

awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt
BucksRaptors

Vestavěné Proměnné #

Awk má řadu vestavěných proměnných, které obsahují užitečné informace a umožňuje ovládat, jak program je zpracován. Níže jsou uvedeny některé z nejběžnějších vestavěných proměnných:

  • NF – počet polí v záznamu.,
  • NR – číslo aktuálního záznamu.
  • FILENAME – název aktuálně zpracovávaného vstupního souboru.
  • FS – oddělovač polí.
  • RS – separátor záznamu.
  • OFS – oddělovač výstupního pole.
  • ORS – oddělovač výstupních záznamů.,

zde je příklad ukazující, jak vytisknout název souboru a počet řádků (záznamů):

awk 'END { print "File", FILENAME, "contains", NR, "lines." }' teams.txt
File teams.txt contains 5 lines.

proměnné v AWK lze nastavit na libovolném řádku v programu. Chcete-li definovat proměnnou pro celý program, vložte ji do vzoru BEGIN.

změna pole a oddělovač záznamů #

výchozí hodnota oddělovače polí je libovolný počet znaků mezery nebo karty. Lze jej změnit nastavením v proměnné FS.,

například pro nastavení oddělovače polí na . byste použili:

awk 'BEGIN { FS = "." } { print $1 }' teams.txt
Bucks Milwaukee 60 22 0Raptors Toronto 58 24 076ers Philadelphia 51 31 0Celtics Boston 49 33 0Pacers Indiana 48 34 0

oddělovač polí lze také nastavit na více než jeden znak:

awk 'BEGIN { FS = ".." } { print $1 }' teams.txt

při spuštění AWK one-liners na příkazovém řádku můžete také použít volbu -F pro změnu oddělovače polí:

awk -F "." '{ print $1 }' teams.txt

ve výchozím nastavení je oddělovač záznamů nový znak a lze jej změnit pomocí RS proměnná.,

Zde je příklad ukazuje, jak změnit záznam oddělovač .:

awk 'BEGIN { RS = "." } { print $1 }' teams.txt
Bucks Milwaukee 60 22 0732 Raptors Toronto 58 24 0707 76ers Philadelphia 51 31 0622Celtics Boston 49 33 0598Pacers Indiana 48 34 0585

Awk Akce #

Awk akce jsou uzavřeny ve složených závorkách ({}) a popraven, když se vzor shoduje. Akce může mít nula nebo více prohlášení. Více příkazů je provedeno v pořadí, v jakém se objeví, a musí být odděleno dvojtečkou nebo dvojtečkou (;).,

Existuje několik typů akce příkazy, které jsou podporovány v awk:

  • Výrazy, jako je proměnná, přiřazení, aritmetické operátory, zvyšovat, a dekrementační operátory.
  • Kontrolní hlášení, který se používá k řízení toku programu (if for while switch, a více)
  • Výstupní prohlášení, například print printf.
  • složené příkazy, seskupit další příkazy.,
  • vstupní příkazy pro řízení zpracování vstupu.
  • příkazy pro odstranění prvků pole.

příkazprint je pravděpodobně nejpoužívanějším prohlášením awk. Vytiskne formátovaný výstup textu, záznamů, polí a proměnných.

při tisku více položek je třeba je oddělit čárkami., Zde je příklad:

awk '{ print $1, $3, $5 }' teams.txt

tištěné položky jsou odděleny jednotlivými mezerami:

Bucks 60 0.732Raptors 58 0.70776ers 51 0.622Celtics 49 0.598Pacers 48 0.585

Pokud nepoužíváte čárky, nebude mezi položkami žádný prostor:

awk '{ print $1 $3 $5 }' teams.txt

tištěné položky jsou zřetězeny:

Bucks600.732Raptors580.70776ers510.622Celtics490.598Pacers480.585

když seprintpoužívá bez argumentu, výchozí hodnotaprint $0. Aktuální záznam je vytištěn.,

Chcete-li vytisknout vlastní text, musíte citovat text s dvojitými znaky:

awk '{ print "The first field:", $1}' teams.txt
The first field: BucksThe first field: RaptorsThe first field: 76ersThe first field: CelticsThe first field: Pacers

můžete také vytisknout speciální znaky, jako je newline:

awk 'BEGIN { print "First line\nSecond line\nThird line" }'
First lineSecond lineThird line

printf příkaz vám dává větší kontrolu nad výstupním formátem., id=“aa8cfd3cbd“>

printf nevytváří novým řádkem po jednotlivých záznamech, tak jsme pomocí \n:

 1. Bucks Milwaukee 60 22 0.732 2. Raptors Toronto 58 24 0.707 3. 76ers Philadelphia 51 31 0.622 4. Celtics Boston 49 33 0.598 5. Pacers Indiana 48 34 0.585

následující příkaz vypočítá součet hodnot uložených v třetí pole v každém řádku:

awk '{ sum += $3 } END { printf "%d\n", sum }' teams.txt
266

Zde je další příklad ukazuje, jak používat výrazy a příkazy k tisku čtverce čísla od 1 do 5:

awk 'BEGIN { i = 1; while (i < 6) { print "Square of", i, "is", i*i; ++i } }'
Square of 1 is 1Square of 2 is 4Square of 3 is 9Square of 4 is 16Square of 5 is 25

Jeden řádek příkazy jako ten výše jsou těžší pochopit a udržovat., Při psaní delších programů byste měli vytvořit samostatný programový soubor:

prg.awk
BEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }

Spustit program předáním názvu souboru do awk tlumočníka:

awk -f prg.awk

můžete také spustit program v jazyce awk, jako spustitelný soubor, pomocí shebang směrnice a nastavení awk interpret:

prg.,awk
#!/usr/bin/awk -fBEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }

Uložte soubor a učinit z něj spustitelný soubor :

chmod +x prg.awk

nyní můžete spustit program zadáním:

./prg.awk

Použití Shell Proměnné v Awk Programy #

Pokud jste pomocí awk příkaz shell skripty, šance jsou, že budete muset projít shell proměnné awk program. Jednou z možností je přiložit program s dvojitým namísto jednotlivých uvozovek a nahradit proměnnou v programu., Tato možnost však zkomplikuje váš program awk, protože budete muset uniknout proměnným awk.

doporučený způsob použití proměnných shellu v programech awk je přiřazení proměnné shellu proměnné awk. Zde je příklad:

num=51awk -v n="$num" 'BEGIN {print n}'

Leave a Comment