GNU/Linux >> Znalost Linux >  >> Linux

Pole AWK vysvětleno na 5 praktických příkladech

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.


Linux
  1. Příkaz vypnutí Linuxu s příklady

  2. Bash pole s příklady

  3. Výukový program Awk:Pochopte proměnné Awk pomocí 3 praktických příkladů

  1. Příkaz Linux Traceroute, vysvětlený s příklady

  2. Perl Array Reference a Dereference Tutorial s praktickými příklady

  3. Echo Command s praktickými příklady

  1. Linux cut Command Vysvětlení pomocí 6 příkladů

  2. Příkaz AWK v Linuxu s příklady

  3. Příkaz Linux ldd vysvětlený s příklady