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.