Awk parancs Linux példákkal

Awk egy általános célú scripting nyelv célja a fejlett szövegfeldolgozás. Többnyire jelentési és elemzési eszközként használják.

a legtöbb eljárási programozási nyelvtől eltérően az awk adatvezérelt, ami azt jelenti, hogy a bemeneti szöveggel szemben végrehajtandó műveletek halmazát határozza meg. A beviteli adatokat átviszi, átalakítja, majd az eredményt szabványos kimenetre küldi.

Ez a cikk az awk programozási nyelv alapvető elemeit tartalmazza., Az awk alapjainak ismerete jelentősen javítja a szöveges fájlok manipulálásának képességét a parancssorban.

hogyan működik az awk #

az awk számos különböző implementációja létezik. Az awk GNU implementációját fogjuk használni, amelyet gawk-nak hívnak. A legtöbb Linux rendszeren aawk értelmező csak egy symlinkgawk.

Records and fields #

Awk can process textual data files and streams. A bemeneti adatok rekordokra és mezőkre vannak felosztva. Awk működik egy rekord egy időben, amíg a végén a bemenet eléréséig., A rekordokat elválasztó karakter választja el. Az alapértelmezett rekordszeparátor a newline karakter, ami azt jelenti, hogy a szöveges adatok minden sora rekord. Új rekordszeparátor állítható be a RS változó segítségével.

A rekordok olyan mezőkből állnak, amelyeket a mezőelválasztó választ el egymástól. Alapértelmezés szerint a mezőket szóköz választja el egymástól, beleértve egy vagy több lapot, szóközt és newline karaktereket.

az egyes rekordok mezőit a dollárjel jelöli ($), majd a mező száma, 1-től kezdve., Az első mező $1, a második $2 stb. Az utolsó mező hivatkozhat a $NFspeciális változóra is. A teljes rekord lehet hivatkozni $0.

itt van egy vizuális ábrázolás, amely bemutatja, hogyan kell hivatkozni rekordok és mezők:

tmpfs 788M 1.8M 786M 1% /run/lock /dev/sda1 234G 191G 31G 87% /|-------| |--| |--| |--| |-| |--------| $1 $2 $3 $4 $5 $6 ($NF) --> fields|-----------------------------------------| $0 --> record

Awk program #

szöveg feldolgozásához awk, írsz egy programot, amely megmondja a parancsnak, hogy mit kell tennie., A program egy sor szabályból és felhasználó által definiált funkcióból áll. Minden szabály egy mintát és egy műveletpárt tartalmaz. A szabályokat newline vagy félig colons választja el (;). Általában egy awk program így néz ki:

pattern { action }pattern { action }...

Ha awk adatokat, ha a minta illeszkedik a rekord, végrehajtja a meghatározott műveletet a rekord. Ha a szabálynak nincs mintája, az összes rekord (sor) illeszkedik.

egy awk-művelet zárójelbe van zárva ({}), és kijelentésekből áll., Minden utasítás meghatározza a végrehajtandó műveletet. Egy műveletnek egynél több kijelentése lehet, amelyeket newline vagy félig colons választ el (;). Ha a szabálynak nincs művelete, akkor alapértelmezés szerint a teljes rekordot kinyomtatja.

az Awk különböző típusú kijelentéseket támogat, beleértve a kifejezéseket, a feltételeket, a bemenetet, a kimeneti nyilatkozatokat stb. A leggyakoribb awk-nyilatkozatok a következők:

  • exit – leállítja a teljes program végrehajtását és kilép.,
  • next – leállítja az aktuális rekord feldolgozását, majd a bemeneti adatok következő rekordjára lép.
  • print – rekordok, mezők, változók és egyéni szöveg nyomtatása.
  • printf – nagyobb ellenőrzést biztosít a kimeneti formátum felett, hasonlóan a C-hez és a Bash printf – hez .

awk programok írásakor a (#) hashjel után mindent megjegyzésnek tekintünk., A hosszú sorok több sorra bonthatók a folytatása karakter, backslash (\) segítségével.

awk programok végrehajtása #

egy awk program többféle módon futtatható. Ha a program rövid, egyszerű, el lehet közvetlenül a awk tolmács a parancs-sor:

awk 'program' input-file...

Amikor fut a program a parancssori kell csatolni az aposztróf jelet (''), tehát a shell nem értelmezi a program.,

Ha a program nagy, komplex, a legjobb, hogy egy fájlt, majd használja a -f lehetőséget, hogy át a fájlt, hogy a awk parancs:

awk -f program-file input-file...

az alábbi példákban, használjuk a fájl neve “csapat.txt”, amely úgy néz ki, mint az alábbi:

Bucks Milwaukee 60 22 0.732 Raptors Toronto 58 24 0.707 76ers Philadelphia 51 31 0.622Celtics Boston 49 33 0.598Pacers Indiana 48 34 0.585

Awk minták #

minták az awk-ban, hogy a kapcsolódó műveletet végre kell-e hajtani vagy sem.,

Awk támogatja a különböző típusú minták, beleértve a reguláris kifejezés, reláció kifejezés, tartomány, speciális kifejezés minták.

Ha a szabálynak nincs mintája, minden bemeneti rekord illeszkedik. Itt egy példa egy szabály, amely csak egy akció:

awk '{ print $3 }' teams.txt

A program kiírja a harmadik mező rekord:

6058514948

Reguláris kifejezés minták #

Egy reguláris kifejezés, vagy a regex egy olyan minta, amely megegyezik egy sor szálakat., Az Awk reguláris kifejezésmintákat a slashes (//) tartalmazza:

/regex pattern/ { action }

a legalapvetőbb példa egy szó szerinti karakter vagy karakterlánc-illesztés. Például a “0.5” – et tartalmazó rekordok első mezőjének megjelenítéséhez a következő parancsot kell futtatnia:

awk '/0.5/ { print $1 }' teams.txt
CelticsPacers

a minta bármilyen típusú kiterjesztett reguláris kifejezés lehet., Itt van egy példa, amely kinyomtatja az első mezőt, ha a rekord két vagy több számjegyből indul:

awk '/^/ { print $1 }' teams.txt
76ers

relációs kifejezésminták #

a relációs kifejezéseket általában egy adott mező vagy változó tartalmához használják.

alapértelmezés szerint a reguláris kifejezések mintái egyeznek a rekordokkal. Ha egy regex-et egy mezőhöz szeretne illeszteni, adja meg a mezőt, majd használja a” contain”összehasonlító operátort (~) a mintával szemben.,

például, hogy a nyomtatás az első mező, rekord, amelynek második mező tartalmaz, “ia” írja be:

awk '$2 ~ /ia/ { print $1 }' teams.txt
76ersPacers

A mérkőzés mezők, amelyek nem tartalmaznak az adott minta használja a !~ operátor:

awk '$2 !~ /ia/ { print $1 }' teams.txt
BucksRaptorsCeltics

lehet összehasonlítani a húrok, vagy számok kapcsolatok, például, nagyobb, mint, kevesebb, egyenlő, stb., A következő parancs kiírja az első területen az összes rekordot, akinek a harmadik mező nagyobb, mint 50:

awk '$3 > 50 { print $1 }' teams.txt
BucksRaptors76ers

Tartomány minták #

Tartomány minták állnak a két minta vesszővel elválasztva:

pattern1, pattern2

az Összes rekordot kezdve egy bejegyzés, amely megfelel az első mintát, amíg egy bejegyzés, amely megfelel a második minta illeszkedik.,

itt van egy példa, amely kinyomtatja az összes rekord első mezőjét a rekordtól kezdve, beleértve a” Raptorokat”, amíg a rekord”Celtics”:

awk '/Raptors/,/Celtics/ { print $1 }' teams.txt
Raptors76ersCeltics

a minták relációs kifejezések is lehetnek. A lenti parancs kiírja az összes rekordot kezdve az egyetlen, akinek a negyedik mező egyenlő 32, míg az, akinek a negyedik mező egyenlő 33:

awk '$4 == 31, $4 == 33 { print $0 }' teams.txt
76ers Philadelphia 51 31 0.622Celtics Boston 49 33 0.598

Tartomány minták nem kombinálható más minta kifejezések.,

speciális kifejezésminták #

Awk a következő speciális pattenseket tartalmazza:

  • BEGIN – műveletek végrehajtására használják a rekordok feldolgozása előtt.
  • END – a rekordok feldolgozása után végrehajtott műveletek végrehajtására szolgál.

aBEGINmintát általában változók beállítására használják, aEND mintát pedig a rekordokból származó adatok feldolgozására, például számításra.

a következő példa kiírja a “feldolgozás megkezdése.”, majd nyomtassa ki az egyes rekordok harmadik mezőjét, majd végül ” Végfeldolgozás.,”:

awk 'BEGIN { print "Start Processing." }; { print $3 }; END { print "End Processing." }' teams.txt
Start Processing6058514948End Processing.

Ha egy programnak csak egy BEGIN mintája van, a műveletek végrehajtásra kerülnek, és a bemenet nem kerül feldolgozásra. Ha EGY program csak END mintával rendelkezik, a bemenet a szabályműveletek végrehajtása előtt kerül feldolgozásra.

az awk Gnu verziója két további speciális mintát is tartalmaz BEGINFILEés ENDFILE, amely lehetővé teszi a műveletek végrehajtását fájlok feldolgozásakor.,

kombinálása minták #

Awk lehetővé teszi, hogy összekapcsolják a két vagy több mintát a logikai és operátor (&&) és logikai vagy operátor (||).,

Itt egy példa, hogy használja a && üzemeltető a nyomtatás az első mező olyan rekord, amelynek harmadik mező nagyobb, mint 50, a negyedik mező kevesebb, mint 30:

awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt
BucksRaptors

Beépített Változók #

Awk számos beépített változók, amelyek hasznos információkat, valamint lehetővé teszi, hogy ellenőrizzék, hogy a program feldolgozása. Az alábbiakban néhány a leggyakoribb beépített változók:

  • NF – a mezők száma a rekordban.,
  • NR – az aktuális rekord száma.
  • FILENAME – A jelenleg feldolgozott bemeneti fájl neve.
  • FS – mező elválasztó.
  • RS – Record separator.
  • OFS – kimeneti mező elválasztó.
  • ORS – kimeneti rekord elválasztó.,

itt van egy példa, amely bemutatja, hogyan kell kinyomtatni a fájl nevét és a sorok számát (rekordok):

awk 'END { print "File", FILENAME, "contains", NR, "lines." }' teams.txt
File teams.txt contains 5 lines.

az AWK változói a program bármely sorában beállíthatók. A teljes programhoz tartozó változó meghatározásához írja be a BEGIN mintába.

mező módosítása és elválasztó rögzítése #

a mezőelválasztó alapértelmezett értéke tetszőleges számú szóköz vagy lap karakter. Meg lehet változtatni a FS változó beállításával.,

például beállíthatjuk, hogy a mező elválasztó, hogy a . használni:

awk 'BEGIN { FS = "." } { print $1 }' teams.txt
Bucks Milwaukee 60 22 0Raptors Toronto 58 24 076ers Philadelphia 51 31 0Celtics Boston 49 33 0Pacers Indiana 48 34 0

A mező elválasztó beállítható az is, hogy több mint egy karaktert:

awk 'BEGIN { FS = ".." } { print $1 }' teams.txt

Ha fut awk egysorosok a parancssorban, akkor is használhatja a -F lehetőséget, hogy változtatni a field separator:

awk -F "." '{ print $1 }' teams.txt

alapértelmezés szerint, a lemez szeparátor egy újsor karakter, de megváltoztatható a RS változó.,

Itt egy példa mutatja, hogyan változik a lemez szeparátor, hogy a .:

awk 'BEGIN { RS = "." } { print $1 }' teams.txt
Bucks Milwaukee 60 22 0732 Raptors Toronto 58 24 0707 76ers Philadelphia 51 31 0622Celtics Boston 49 33 0598Pacers Indiana 48 34 0585

Awk Intézkedések #

Awk intézkedések kapcsos zárójelek között ({}), majd kivégezték, ha a minta illeszkedik. Egy műveletnek nulla vagy több kijelentése lehet. A megjelenésük sorrendjében több utasítás is végrehajtásra kerül, ezeket newline vagy fél-colonokkal kell elválasztani (;).,

az awk:

  • kifejezésekben többféle műveletkimutatás létezik, például változó hozzárendelés, aritmetikai operátorok, növekmény és csökkentési operátorok.
  • a program áramlásának szabályozására használt vezérlési utasítások (if, for, while, switch és több)
  • kimeneti utasítások, például
  • div id=”43892cdcfa”>és printf.

  • összetett kijelentések, más kijelentések csoportosításához.,
  • bemeneti utasítások a bemenet feldolgozásának vezérléséhez.
  • törlési utasítások a tömb elemek eltávolításához.

aprint nyilatkozat valószínűleg a leggyakrabban használt awk nyilatkozat. Kiírja a formázott kimenetet a szöveg, rekordok, mezők, változók.

Több elem nyomtatásakor vesszővel kell elválasztania őket., Itt egy példa:

awk '{ print $1, $3, $5 }' teams.txt

A nyomtatott elemek elválasztott egyes terek:

Bucks 60 0.732Raptors 58 0.70776ers 51 0.622Celtics 49 0.598Pacers 48 0.585

Ha nem használja a vesszőt, nem lesz tér a elemek:

awk '{ print $1 $3 $5 }' teams.txt

A nyomtatott elemek összefűzött:

Bucks600.732Raptors580.70776ers510.622Celtics490.598Pacers480.585

Ha print használják, anélkül, hogy egy vita, akkor az alapérték print $0. A jelenlegi rekord kinyomtatásra kerül.,

egyéni szöveg nyomtatásához idéznie kell a szöveget kettős idézőjelekkel:

awk '{ print "The first field:", $1}' teams.txt
The first field: BucksThe first field: RaptorsThe first field: 76ersThe first field: CelticsThe first field: Pacers

speciális karaktereket is kinyomtathat, például newline:

awk 'BEGIN { print "First line\nSecond line\nThird line" }'
First lineSecond lineThird line

a printf utasítás nagyobb ellenőrzést biztosít a kimeneti formátum felett., id=”aa8cfd3cbd”>

printf nem hoz létre újvonalat minden rekord után, ezért a \n:

 1. Bucks Milwaukee 60 22 0.732 2. Raptors Toronto 58 24 0.707 3. 76ers Philadelphia 51 31 0.622 4. Celtics Boston 49 33 0.598 5. Pacers Indiana 48 34 0.585

a következő paranccsal kiszámítja az alábbi parancsban tárolt értékek összegét harmadik mező minden sorban:

awk '{ sum += $3 } END { printf "%d\n", sum }' teams.txt
266

itt van egy másik példa, amely bemutatja, hogyan kell kifejezéseket és ellenőrzési nyilatkozatokat használni a számok négyzetének nyomtatásához 1-től 5-ig:

awk 'BEGIN { i = 1; while (i < 6) { print "Square of", i, "is", i*i; ++i } }'

egysoros parancsok, mint például a fenti nehezebb megérteni és fenntartani., Hosszabb programok írásakor külön programfájlt kell létrehoznia:

prg.awk
BEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }

futtassa a programot úgy, hogy a fájl nevét átadja a awk tolmács:

awk -f prg.awk

futtatható awk programként is futtatható a shebang irányelv és a awk értelmező beállítása:

PRG.,awk
#!/usr/bin/awk -fBEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }

Mentsük el a fájlt, hogy futtatható :

chmod +x prg.awk

most tudja futtatni a programot megadásával:

./prg.awk

A Shell Változókat Awk Programok #

Ha használja a awk parancs a shell scriptek, nagy az esélye, hogy meg kell adni egy shell változó, hogy az awk program. Az egyik lehetőség, hogy csatolja a program dupla helyett egyetlen idézetek helyett helyettesíti a változó a programban., Ez az opció azonban bonyolultabbá teszi az awk programot, mivel el kell kerülnie az awk változókat.

a shell változók awk programokban történő használatának javasolt módja a shell változó hozzárendelése egy awk változóhoz. Íme egy példa:

num=51awk -v n="$num" 'BEGIN {print n}'

Leave a Comment