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 $NF
speciá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 Bashprintf
– 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.
aBEGIN
mintá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
- ö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.
div id=”43892cdcfa”>és printf
.
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:
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:
#!/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=51
awk -v n="$num" 'BEGIN {print n}'