Weboldal keresés

Hogyan írjunk szkripteket az Awk programozási nyelv használatával?


Az Awk egy erőteljes szövegfeldolgozó nyelv, amelyet három eredeti szerzőjéről neveztek el: Alfred Ahoról, Peter Weinbergerről és Brian Kernighanről. Ez egy sokoldalú nyelv, amelyet elsősorban minták beolvasására és feldolgozására használnak. Az Awk a Unix-szkriptek alapeleme, és gyakran használják olyan feladatokhoz, mint az adatkinyerés, a jelentéskészítés és az adatátalakítás.

Az awk-szkriptek gyorsan írhatók, és jól teljesítenek kis és közepes méretű feladatoknál. Ebben a cikkben bemutatjuk az Awk programozási nyelv segítségével történő szkriptek írásának alapjait.

Alapszintaxis

Az Awk program minta-művelet párok sorozatából áll, amelyeket −-ként írunk le

pattern { action }

Itt a minta egy feltétel. Ha a bemeneti sor megegyezik a mintával, akkor a művelet végrehajtásra kerül.

Például −

awk '/search_pattern/ { print $0 }' file_name

Ebben a példában az awk megkeresi a keresési mintát tartalmazó sort a file_name fájlból, és ha egyezik, kiírja a teljes sort ($0).

Változók használata

Az Awk beépített változókkal rendelkezik, amelyek segítségével formázhatja a kimenetet. A leggyakoribbak közül néhány a −

  • $0 − A teljes sor.

  • $1, $2, ... − Minden egyes mező (alapértelmezett szóközzel határolt).

  • FS − Mezőelválasztó (alapértelmezett szóköz).

  • OFS − Kimeneti mező elválasztó (alapértelmezett szóköz).

  • NR – A feldolgozott rekordok száma.

  • NF − A mezők száma az aktuális rekordban.

Nézzünk egy gyakorlati példát e változók némelyikére. Tételezzük fel, hogy van egy 'students.txt' nevű szöveges fájlunk a következő tartalommal −

John Doe 18
Jane Smith 19

Az awk segítségével külön nyomtathatjuk a neveket és az életkorokat −

awk '{ print "Name: " $1 " " $2 ", Age: " $3 }' students.txt

A kimenet a − lesz

Name: John Doe, Age: 18
Name: Jane Smith, Age: 19

Control Flow

Az Awk támogatja az olyan általános vezérlési folyamatokat is, mint az if, else, while és for. Íme egy példa az if és else − használatára

awk '{ if ($3 > 18) print $1 " is an adult"; else print $1 " is a minor"}' students.txt

A kimenet a − lesz

John is an adult
Jane is a minor

Funkciók

Az Awk többek között beépített függvényekkel rendelkezik a karakterlánc-kezeléshez, az aritmetikai műveletekhez és a bemenethez/kimenethez. Meghatározhatja saját funkcióit is.

Íme egy példa egy felhasználó által definiált függvényre, amely a hőmérsékletet Fahrenheit-ről Celsius-fokra alakítja át −

function toCelsius(fahrenheit) {
   return (fahrenheit - 32) * 5/9
}

BEGIN { print "Fahrenheit Celsius" }
{ print $1, toCelsius($1) }

Ha van egy 'temperatures.txt' bemeneti fájlunk Fahrenheit hőmérsékletekkel −

32
212

A kimenet a − lesz

Fahrenheit Celsius
32 0
212 100

Reguláris kifejezések

Az Awk támogatja a reguláris kifejezés szintaxisát, amely használható a mintaillesztéshez. Íme egy alapvető példa, ahol olyan sorokat keresünk a „students.txt” fájlban, amelyek „J” betűvel kezdődnek.

awk '/^J/ { print $0 }' students.txt

Ebben az esetben a körvonal (^) szimbólum egy sor kezdetét jelenti. Ez a szkript a −

John Doe 18
Jane Smith 19

Tömbök

Az Awk támogatja az egydimenziós tömböket, amelyek összetettebb adatkezelésre használhatók. Tekintsünk egy esetet, amikor meg akarjuk számolni az életkorok előfordulását a „students.txt” fájlunkban. Így teheti meg −

awk '{ count[$3]++ } END { for (age in count) print age " appears " count[age] " times." }' students.txt

Ez a kimenetet fogja eredményezni

18 appears 1 times.
19 appears 1 times.

Ebben a szkriptben a count[$3]++ az életkort (harmadik mező) használja a tömb kulcsaként, és minden alkalommal növeli az értékét, amikor megjelenik.

Speciális adatkezelés

Az Awk számos beépített funkciót is kínál a fejlettebb adatkezeléshez. Például biztosítja a split() függvényt, amely egy karakterláncot tömbre oszthat fel

awk '{ split($1, array, ""); print "First letter of the name: " array[1] }' students.txt

Ez a szkript a −

First letter of the name: J
First letter of the name: J

Az awk kombinálása más Unix parancsokkal

Az Awk szkripteket más Unix-parancsokkal kombinálhatja csővel (|), ami még hatékonyabb eszközzé teszi.

cat students.txt | awk '{ print $1 }' | sort | uniq

Ez a parancs kinyomtatja a tanulók keresztnevét, rendezi őket, majd eltávolítja az ismétlődéseket. Ebben az esetben a kimenet − lesz

Jane
John

Szkriptek használata az awk-ban

Míg az Awk használata közvetlenül a terminálban elterjedt egyszerű feladatoknál, összetettebb műveleteknél kényelmesebb lehet szkripteket írni. Az Awk szkriptek ugyanazt a minta-művelet struktúrát követik, de külön fájlba vannak írva.

Először hozzon létre egy új fájlt .awk kiterjesztéssel. A szkript felső sorának a shebang sornak kell lennie, amely az Awk értelmezőre mutat −

#!/usr/bin/awk -f

Hozzunk létre egy Awk szkriptet 'students.awk' néven, amely kiszámítja a tanulók átlagéletkorát.

#!/usr/bin/awk -f
BEGIN { 
   sum = 0
   count = 0
}
{ 
   sum += $3
   count++ 
}
END {
   print "Average age: " sum/count
}

A szkript futtatásához tegye végrehajthatóvá a chmod +x students.awk paranccsal, majd futtassa a ./students.awk students.txt fájllal. Ez kinyomtatja a −

Average age: 18.5

Awk szkriptek hibakeresése

Az Awk szkriptek hibakeresése kissé bonyolult lehet a beépített hibakereső eszközök hiánya miatt. Hasznos lehet azonban, ha print utasításokat használ a változók értékének megjelenítésére a szkript különböző pontjain.

Ezenkívül a -W dump-variables[=file] kapcsolóval az összes változót és tömböt kiírhatja egy fájlba hibakeresés céljából. A beállítás használatához az awk -W dump-variables=dump.txt script.awk parancsot kell végrehajtania.

Speciális mintaillesztés

Az Awk emellett támogatja a speciális mintaillesztést reguláris kifejezésekkel. Például használhatja a ~ operátort egy mező és egy reguláris kifejezés párosítására.

Tekintsünk egy students.txt fájlt egy további mezővel az éppen tanult kurzushoz −

John Doe 18 ComputerScience
Jane Smith 19 Mathematics

Számítástechnikát tanuló hallgatók kereséséhez írja be a −

awk '$4 ~ /ComputerScience/ { print $1 " " $2 " is studying Computer Science." }' students.txt

Ez a kimenetet fogja eredményezni

John Doe is studying Computer Science.

Következtetés

Az Awk egy hatékony eszköz a szövegfeldolgozáshoz Unix-alapú rendszereken. Ereje az egyszerűségében és a szintaxis egyértelmű természetében rejlik. Akár szöveget manipulál, akár aritmetikai számításokat végez, az Awk kiváló eszköz a programozási eszköztárban.

Ne feledje, hogy az Awk (vagy bármely más nyelv) megtanulásának legjobb módja annak használata. Próbáljon meg saját Awk-szkripteket létrehozni, kezdve az egyszerű feladatokkal, és fokozatosan áttérni az összetettebbekre, ahogy egyre jobban érzi magát a nyelven.

Kapcsolódó cikkek: