awk

A Wikipédiából, a szabad enciklopédiából

Az awk egy olyan programozási nyelv, amit szöveges állományok földolgozására terveztek. Elnevezése a megalkotói – Alfred Aho, Peter Weinberger és Brian Kernighan – családneveinek kezdőbetűiből született. A UNIX 3 verziójában jelent meg. Ideális szöveges állományok szűrésére, átformálására és kiértékelésére. Ma is minden unix rendszeren van legalább egy awk változat. A Free Software Foundation a gawk nevű változatot gondozza, a Linux disztribúciókkal is jellemzően a gawk implementációt szállítják. Windows rendszerekhez is letölthető a gawk például a Cygwin részeként.

Az awk kizárólag karaktersorozatokkal, más szóval stringekkel foglalkozik, a számábrázolásra is ezeket használja. Emellett ismeri az hasítótáblákat, más szóval asszociatív tömböket is. (Példa: a["kutya"], a["macska"]) Ezek például szótárszerű alkalmazásoknál nyújtanak kitűnő segítséget. A reguláris kifejezések (idegen szóval regular expressions) szintén a nyelv részei.

Az awk nyelv ereje, rövidsége, de az awk szkriptek határainak felismerése adta Larry Wallnak az ötletet a Perl nyelv kifejlesztésére.

Egy awk program felépítése[szerkesztés | forrásszöveg szerkesztése]

Egy tipikus awk program a végrehajtása során a bemeneti adatokat másféle kimenetté formálja át.

A programok általában mintából és a mintához tartozó parancsokból állnak:

  • /1. minta / { parancs(ok) }
  • /2. minta / { parancs(ok) }

Az awk soronként olvassa a bemenetet, ezért az awk program működéséhez kis operatív memória is elegendő. Minden beolvasott sort összehasonlít a mintákkal, és ha illeszkedést talál, a parancsokat végrehajtja. A mintákat a szabályos kifejezések szabályai szerint értelmezi.

A különleges parancsformák:

BEGIN { parancs(ok) }
adatbeolvasás előtt ezeket a parancsokat végrehajtja
END { parancs(ok) }
adatbeolvasás és a többi parancs végrehajtása után ezeket a parancsokat végrehajtja
/minta/
ha nincs külön parancs megadva, a mintának megfelelő sort kinyomtatja
{ akció }
ha nincs minta megadva, a parancsokat végrehajtja minden sorra egymás után

Változók[szerkesztés | forrásszöveg szerkesztése]

Lehetséges a változók használata. A programozó maga is definiálhat változókat, de vannak előre megadott változók, nevezetesen:

$0 
a feldolgozás alatt álló egész sor
$1, $2, …$n 
a sor egyes, egymástól szóközzel elválasztott részei

Ez az automatikus felbontás nagyon egyszerűvé és hatékonnyá teszi a sorok feldolgozását.

Awk parancsok[szerkesztés | forrásszöveg szerkesztése]

Az awk nyelv szintaxisa hasonlít a C nyelvéhez, ami nem csoda, hiszen az awk nyelv egyik szerzője, Brian W. Kernighan a C nyelv megalkotója. Elemi parancsok a változóknak való értékadás, a változók összehasonlítása, az elágazás (if…else) és a ciklus (for, while). Emellett belső függvényeket, illetve saját implementálású függvényeket is meg lehet hívni. Egy egyszerű függvénydefiníció lehet például a következő:

function add_three (number, temp) {
  temp = number + 3
  return temp
}

Egy így definiált függvény az alábbi szintaxissal hívható meg. Ennek a parancsnak a hatására 39 íródik a kimenetre:

print add_three(36)

Az adatokat a "print" paranccsal lehet kinyomtatni, azaz a kimenetre írni. Például egy sor második mezőjét a

 print $2

paranccsal nyomtatjuk/írhatjuk ki a szabványos kimenetre.

Példák[szerkesztés | forrásszöveg szerkesztése]

Helló, világ![szerkesztés | forrásszöveg szerkesztése]

A „Helló, világ!” program awk-ban a következőképpen implementálható:

BEGIN { print "Helló, világ!" }

Adott karakterszámnál hosszabb sorok kiíratása[szerkesztés | forrásszöveg szerkesztése]

A következő programmal a 80 karakternél hosszabb sorokat írja ki. Vegyük észre, hogy az alapértelmezett akció a sor kiírása:

length > 80

Minden n. sor kiírása[szerkesztés | forrásszöveg szerkesztése]

Adatsorok egyenletes ritkítására is felhasználható az awk. Az alábbi programot végrehajtva az awk minden 4. sort ír a kimenetre [1]:

awk '{if (count++%4==0) print $0;}' adatsorom.csv

vagy egyszerűbben:

awk '!(count++%4)' adatsorom.csv

Sorok, szavak és karakterek megszámlálása[szerkesztés | forrásszöveg szerkesztése]

Az alábbi awk program megszámolja majd kiírja a bemeneti fájlban lévő sorok, szavak és karakterek számát úgy, mint a wc nevű program:

{
    w += NF
    c += length + 1
}
END { print NR, w, c }

Szavak előfordulási gyakoriságának kiszámítása[szerkesztés | forrásszöveg szerkesztése]

Szavak gyakoriságáról készít statisztikát asszociatív tömb felhasználásával a következő példa:

BEGIN { RS="[^a-zA-Z]+"} 

{ words[tolower($0)]++ }

END { for (i in words)
    print i, words[i]
}

Irodalom[szerkesztés | forrásszöveg szerkesztése]

  • Alfred V. Aho, Brian W. Kernighan, and Peter J. Weinberger: Az AWK Programozási nyelv. Addison-Wesley, 1988, ISBN 0-201-07981-X

Külső hivatkozások[szerkesztés | forrásszöveg szerkesztése]