Programovací jazyk Awk podporuje pole. V rámci naší pokračující série příkladů awk jsme viděli uživatelem definované proměnné awk a vestavěné proměnné awk. Pole jsou rozšířením proměnných. Pole jsou proměnné, které obsahují více než jednu hodnotu. Podobně jako proměnné mají pole také názvy. V některých programovacích jazycích musí být pole deklarována, takže pro pole bude přidělena paměť. Indexy polí jsou také obvykle celočíselné, jako pole[1], pole[2] atd.,
Awk Associative Array
Awk podporuje pouze asociativní pole. Asociativní pole jsou jako tradiční pole s tím rozdílem, že jako své indexy používají spíše řetězce než čísla. Při použití asociativního pole můžete napodobit tradiční pole pomocí číselného řetězce jako indexu.
Syntax: arrayname[string]=value
Ve výše uvedené syntaxi awk:
- název pole je název pole.
- řetězec je index pole.
- hodnota je jakákoli hodnota přiřazená prvku pole.
Přístup k prvkům pole AWK
Chcete-li přistupovat k určitému prvku v poli, můžete k němu přistupovat prostřednictvím jeho indexu — název pole[index], který vám dává hodnotu přiřazenou v tomto indexu.
Chcete-li získat přístup ke všem prvkům pole, můžete pomocí smyčky projít všechny indexy pole, jak je znázorněno níže.
Syntax: for (var in arrayname) actions
Ve výše uvedené syntaxi awk:
- var je libovolný název proměnné
- v je klíčové slovo
- název pole je název pole.
- akce jsou seznamy příkazů, které mají být provedeny. Pokud chcete provést více než jednu akci, musí být uzavřena ve složených závorkách.
Tato smyčka provádí seznam akcí pro každou jinou hodnotu, která byla použita jako index v poli s proměnnou var nastavenou na tento index.
Odebrání prvku z pole AWK
Pokud chcete odstranit prvek v konkrétním indexu pole, použijte příkaz awk delete. Jakmile odstraníte prvek z pole awk, již tuto hodnotu nemůžete získat.
Syntax: delete arrayname[index];
Příkaz loop níže odstraní všechny prvky z pole. Neexistuje jediný příkaz k odstranění všech prvků z pole. Musíte projít smyčkou a odstranit každý prvek pole pomocí příkazu awk delete.
for (var in array) delete array[var]
5 praktických příkladů pole Awk
Všechny níže uvedené příklady používají níže uvedený soubor Iplogs.txt. Tento ukázkový textový soubor obsahuje seznam IP adres požadovaných serverem brány. Tento ukázkový soubor Iplogs.txt obsahuje data v následujícím formátu:
[date] [time] [ip-address] [number-of-websites-accessed]
$ cat Iplogs.txt 180607 093423 123.12.23.122 133 180607 121234 125.25.45.221 153 190607 084849 202.178.23.4 44 190607 084859 164.78.22.64 12 200607 012312 202.188.3.2 13 210607 084849 202.178.23.4 34 210607 121435 202.178.23.4 32 210607 132423 202.188.3.2 167
Příklad 1. Vypište všechny jedinečné adresy IP a kolikrát byly požadovány
$ awk '{ > Ip[$3]++; > } > END{ > for (var in Ip) > print var, "access", Ip[var]," times" > } > ' Iplogs.txt 125.25.45.221 access 1 times 123.12.23.122 access 1 times 164.78.22.64 access 1 times 202.188.3.2 access 2 times 202.178.23.4 access 3 times
Ve výše uvedeném skriptu:
- Třetí pole (3 $) je adresa IP. To se používá jako index pole s názvem Ip.
- Pro každý řádek zvyšuje hodnotu odpovídajícího indexu IP adresy.
- Nakonec v sekci END bude veškerý index představovat seznam jedinečných IP adres a jejich odpovídající hodnoty představují počet výskytů.
Příklad 2. Vypište všechny IP adresy a spočítejte, na kolik stránek se připojilo
Poslední pole v souboru Iplogs.txt je počet webů, na které každá IP adresa přistupovala v určité datum a čas. Níže uvedený skript vygeneruje zprávu, která obsahuje seznam IP adres a kolikrát si vyžádal bránu a celkový počet stránek, na které přistupoval.
$cat ex2.awk BEGIN { print "IP Address\tAccess Count\tNumber of sites"; } { Ip[$3]++; count[$3]+=$NF; } END{ for (var in Ip) print var,"\t",Ip[var],"\t\t",count[var]; } $ awk -f ex2.awk Iplogs.txt IP Address Access Count Number of sites 125.25.45.221 1 153 123.12.23.122 1 133 164.78.22.64 1 12 202.188.3.2 2 180 202.178.23.4 3 110
Ve výše uvedeném příkladu:
- Má dvě pole. Index pro obě pole je stejný – což je IP adresa (třetí pole).
- První pole s názvem „Ip“ má seznam jedinečných IP adres a počet jejich výskytů. Druhé pole nazvané „count“ má IP adresu jako index a jeho hodnotou bude poslední pole (počet webů), takže kdykoli přijde IP adresa, stále se přidává poslední pole.
- V sekci END projde všechny IP adresy a vypíše IP adresu a počet přístupů z pole nazvaného Ip a počet webů z pole.
Příklad 3. Určete maximální den přístupu
$ cat ex3.awk { date[$1]++; } END{ for (count in date) { if ( max < date[count] ) { max = date[count]; maxdate = count; } } print "Maximum access is on", maxdate; } $ awk -f ex3.awk Iplogs.txt Maximum access is on 210607
V tomto příkladu:
- Pole s názvem „date“ má datum jako index a počet výskytů jako hodnotu pole.
- max je proměnná, která má hodnotu počtu a používá se ke zjištění data, které má maximální počet.
- maxdate je proměnná, která má datum, pro které je počet maximální.
Příklad 4. Obrátit pořadí řádků v souboru
$ awk '{ a[i++] = $0 } END { for (j=i-1; j>=0;) print a[j--] }' Iplogs.txt 210607 132423 202.188.3.2 167 210607 121435 202.178.23.4 32 210607 084849 202.178.23.4 34 200607 012312 202.188.3.2 13 190607 084859 164.78.22.64 12 190607 084849 202.178.23.4 44 180607 121234 125.25.45.221 153 180607 093423 123.12.23.122 133
V tomto příkladu
- Začíná zaznamenáním všech řádků v poli „a“.
- Když program dokončí zpracování všech řádků, Awk provede blok END { }.
- Blok END zacyklí prvky v poli „a“ a vytiskne zaznamenané řádky obráceným způsobem.
Příklad 5. Odstraňte duplicitní a nesouvislé řádky pomocí awk
$ cat > temp foo bar foo baz bar $ awk '!($0 in array) { array[$0]; print }' temp foo bar baz
V tomto příkladu:
- Awk přečte každý řádek ze souboru „temp“ a pomocí operátoru „in“ zkontroluje, zda aktuální řádek existuje v poli „a“.
- Pokud neexistuje, uloží a vytiskne aktuální řádek.
Doporučená četba
Sed and Awk 101 Hacks, od Rameshe Natarajan . V prostředí UNIX/Linux trávím několik hodin denně a zabývám se textovými soubory (data, konfigurační soubory a soubory protokolu). Sed a Awk používám pro všechny své práce s textem. Na základě mých zkušeností se Sed and Awk jsem napsal e-knihu Sed and Awk 101 Hacks, která obsahuje 101 praktických příkladů různých pokročilých funkcí Sed a Awk, které zlepší váš život v UNIX / Linux. I když Sed and Awk používáte několik let a nečetli jste tuto knihu, udělejte si laskavost a přečtěte si tuto knihu. Budete ohromeni možnostmi nástrojů Sed a Awk.