Tartalomjegyzék

< Linux

Awk

Bevezetés

Az awk egy mintakereső és -feldolgozó nyelv. Rövid gyorstalpalót találunk itt mintákkal.

Legyen „dol” néven kezdődő állomány amelyen végrehajtjuk feladatainkat:

dolgozok.txt
001 Rigó Dániel Szolnok 1969-10-8 720000
002 Nagy Tamás Budapest 1953-11-26 12300
003 Gyenge Tamás Szolnok 1974-09-8 740000
004 Kiss Tamás Győr 1968-02-16 290000
005 Budai Károly Budapest 1986-03-20 470000
006 Bodnár Zoltán Hatvan 1962-08-17 330000
007 Vitéz László Győr 1983-03-15 590000
008 Veres Gábor Hatvan 1975-02-13 210000
009 Kiss Béla Miskolc 1953-07-1 730000
010 Gyenge Zoltán Győr 1953-02-7 240000
011 Róka László Győr 1980-02-9 120000
012 Budai Ferenc Nyíregyháza 1972-06-24 630000
013 Nagy György Győr 1977-01-26 600000
014 Vitéz László Szolnok 1974-06-2 700000
015 Varga József Szeged 1968-03-27 130000
016 Kis Géza Budapest 1971-08-1 720000
dolgozok2.txt
001:Varga Dániel:Győr:Rezgő köz u.36:1970-03-25:10000
002:Fényes Gábor:Szeged:Orsovahida utca u.57:1976-05-7:140000
003:Szalai Tamás:Budapest:Vértanú utca u.48:1984-02-1:600000
004:Róka József:Budapest:Fogarasi park u.93:1985-03-21:320000
005:Horváth Géza:Hatvan:Kiránduló utca u.100:1978-09-13:40000
006:Szántó Tamás:Nyíregyháza:Sáránd utca u.117:1984-07-25:710000
007:Erdős Lajos:Budapest:Szalamandra út u.72:1975-09-2:610000
008:Szabó Gábor:Hatvan:Szerelmey Miklós utca u.46:1957-02-13:750000
009:Takács Tamás:Budapest:Szalóki utca u.3:1980-06-9:680000
010:Horváth Lajos:Győr:Szabó Lőrinc utca u.6:1950-07-14:340000
011:Horváth Dániel:Szeged:Hengermű utca u.22:1979-09-26:480000
012:Veres Béla:Budapest:Kerekeskút utca u.107:1986-01-19:480000
013:Erdős Dániel:Szeged:Rétihéja utca u.22:1958-10-7:270000
014:Illés Gábor:Szeged:Nagykikinda utca u.28:1973-01-24:180000
015:Szalai Gábor:Hatvan:Hangos utca u.30:1951-09-20:170000
016:Kiss Zoltán:Miskolc:Luther utca u.114:1968-10-25:90000
017:Fényes Géza:Miskolc:Apahida utca u.101:1978-10-2:660000
018:Vitéz Ferenc:Győr:Mátyás király út u.19:1969-06-23:640000

grephez hasonló működés

awk /Szolnok/ dolgozok.txt

Az összes sor kiíratása:

awk {print} dolgozok.txt

Adott sor kiíratása:

awk '/^005/ {print}' dolgozok.txt

Adott mező kiíratása

awk '{print $4}' dolgozok.txt

Eredmény:

Szolnok
Budapest
Szolnok
Győr
Budapest
Hatvan
Győr
Hatvan
Miskolc
Győr
Győr
Nyíregyháza
Győr
Szolnok
Szeged
Budapest

Mezőelválasztók beállítása:

awk -F:  '{print $3}' dolgozok2.txt

Két mező kiíratása:

awk '{print $2$3}' dolgozok.txt

Eredmény:

RigóDániel
NagyTamás
GyengeTamás
KissTamás
BudaiKároly
BodnárZoltán
VitézLászló
VeresGábor
KissBéla
GyengeZoltán
RókaLászló
BudaiFerenc
NagyGyörgy
VitézLászló
VargaJózsef
KisGéza

A vezeték- és keresztnevek szóköz nélkül kerülnek kiíratásra.

Mezők tagolása:

awk '{print $2" "$3}' dolgozok7.txt

Eredmény:

Rigó Dániel
Nagy Tamás
Gyenge Tamás
Kiss Tamás
Budai Károly
Bodnár Zoltán
Vitéz László
Veres Gábor
Kiss Béla
Gyenge Zoltán
Róka László
Budai Ferenc
Nagy György
Vitéz László
Varga József
Kis Géza

A vezeték- és keresztnevek között szóköz van.

Feltétel megadása

A következőkben csak azon sorok fizetés mezőit szeretnénk kiíratni, amelyeknél az érték kisebb mint 200000. A feladat megoldása:

awk '$6 < 200000 {print $6}' dolgozok.txt

Eredmény:

123000
120000
130000

Számítások

A fenti állomány tartalmát szeretnénk összegezni.

 awk '{print osszeg += $6}' dolgozok.txt

A megoldás a helyes eredményt végül megadja, és végig látjuk hogyan alakul az osszeg nevű változó értéke. Legtöbbször azonban nekünk ez felesleges, csak a végeredményt szeretnénk látni.

Akkor szeretnénk utasítást végrehajtani, ha a sorokon végig mentünk:

 awk '{osszeg += $6} END{print osszeg}' dolgozok.txt

Az „END után írt kapcsos-zárójelek közzé olyan utasításokat írhatunk, amelyek csak akkor hajtódnak végre, ha az awk már végig ment az összes soron.

A megoldás teljesebb lehet, ha valamilyen tájékoztató szöveget is írunk a képernyőre, hogy a kapott érték mit is jelent.

Tájékoztató szöveg:

awk '{osszeg += $6}  \
END{print "Összeg: " osszeg}' dolgozok.txt

Az eddig ismereteinket felhasználva akár átlagot is számolhatunk:

Átlag:

awk '{osszeg += $6; num++} \
END {print "Összeg: " osszeg; print "Száma: "  num; \
print "Átlag: " osszeg / num}' dolgozok.txt

Eredmény:

Összeg: 18853400
Száma: 71
Átlag: 265541

Keverés

szamok.txt
1
2
3
4
5
6

Állomány sorainak megkeverése:

awk '{ print rand(), $1 }' sorted.lst |  sort -n | cut -d " " -f 2

Lehetséges eredmény:

4
2
1
3
6
5

Feldolgozás előtt

A neveket és a fizetéseket szeretnénk kiíratni, de csak ha a fizetés kisebb mint 200000, a két oszlopot pedig felirattal szeretnénk ellátni.

awk -F: 'BEGIN {print "Név\t\tFizetés"} $6 < 200000 { print $2"\t"$6}' dolgozok2.txt

A BEGIN{} zárójelei között adjuk meg, hogy mi történjen az oszlopok feldolgozása előtt.

Eredmény:

Név		Fizetés
Varga Dániel	10000
Fényes Gábor	140000
Horváth Géza	40000
Illés Gábor	180000
Szalai Gábor	170000
Kiss Zoltán	90000

Program

A következőkben awk programokat készítünk.

listaz.awk
#!/usr/bin/awk -f
 
{
    print $2
}

Futtatás:

./listaz.awk dolgozok.txt
kisfizu.awk
#!/usr/bin/awk -f
 
BEGIN {
    FS= ":"
}
 
 
$6 < 200000 {
    print $6
}

Ebben az awk programban beállítjuk a mezőelválasztót, amelyet az FS változó jelképez.

Futtatás:

./kisfizu.awk dolgozok2.txt

Irodalom