A nyelvet AWK-nak nevezzük, az AWK-programokat értelmező futtatható programot pedig awk-nak vagy gawk-nak.
Egy AWK-program minta-művelet párokból áll.
pattern1 { action1 }
pattern2 { action2 }
...
A minta lehet reguláris kifejezés, amelyet a bemenetre illesztünk. Emellett bármilyen kifejezés lehet, amely igaz vagy hamis értéket ad eredményül.
A művelet egy vagy több AWK-parancs. A körülvevő kapcsos zárójelek kötelezők.
Ha a minta eredménye igaz, akkor a hozzá tartozó művelet kiértékelődik.
Az AWK a bemenetet rekordok sorozataként dolgozza fel. Minden rekord nulla vagy több mezőre bomlik.
Az alapértelmezett viselkedés a következő:
A minta elhagyható, ebben az esetben a művelet minden bemeneti rekordra kiértékelődik.
A művelet is elhagyható, ilyenkor az alapértelmezett művelet az aktuális rekord kiírása.
Két különleges minta is gyakran használatos.
BEGIN a hozzá tartozó műveletet még azelőtt kiértékeli, hogy bármilyen bemenetet feldolgoznánk.END a hozzá tartozó műveletet az összes bemenet feldolgozása után értékeli ki.A mezőkre $1, $2, $3 stb. formában hivatkozol.
Az aktuális rekord a $0.
Íme néhány más gyakran használt beépített változó.
RS a bemenet rekordelválasztója.
Ahogy említettük, alapértéke az újsor karakter.FS a bemenet mezőelválasztója.Ezeket a változókat gyakran a BEGIN műveletblokkban állítjuk be.
Ezeket a változókat az AWK automatikusan beállítja a program futása közben.
NF az aktuális rekord mezőinek számát tárolja.
$NF-et.NR az aktuális rekordszámot tárolja.
NR az eddig feldolgozott rekordok összes számát tartalmazza.FNR az aktuális bemeneti fájl aktuális rekordszámát tárolja.
NR == FNR {action}
Ez annyit jelent, hogy „ha a felhalmozott rekordszám egyenlő az aktuális fájl rekordszámával”.
Ez csak az első bemeneti fájl rekordjaira lehet igaz.Az AWK ugyanazt az igazságértelmezést használja, mint a C.
0 szám hamis.Mivel az AWK szövegfeldolgozó nyelv, az igazságértékek kiterjednek a stringekre is.
"" hamis.A megjegyzések a # karakterrel kezdődnek, és a sor végéig tartanak.
A Unix-szerű rendszereken az /etc/passwd a felhasználókra vonatkozó információkat tartalmaz.
Minden felhasználó külön sorban szerepel, a mezőket kettőspontok választják el.
A felhasználónevek felsorolásához:
awk '
BEGIN { FS = ":" }
{ print $1 }
' /etc/passwd
Figyeld meg, hogy a {print $1} művelethez nem tartozik minta, így minden rekordnál végrehajtódik.
Ha a kimenetet csak azokra a felhasználókra szeretnénk korlátozni, akik a bash-t használják bejelentkezési shellként, ezt így tehetjük:
awk '
BEGIN { FS = ":" }
$7 == "/bin/bash" { print $1 }
' /etc/passwd
Egyszer volt, hol nem volt, volt egyszer egy nyüzsgő város, amit Cyberspace-nek hívtak. A Cyberspace egy digitális nagyváros volt, ahol naponta több millió lakos jelentkezett be és ki. Hogy számon tartsa ezeket a felhasználókat, a Cyberspace-nek volt egy különleges fájlja, az /etc/passwd.
Az /etc/passwd fájl olyan volt, mint a város telefonkönyve. Felsorolta az összes felhasználót, akinek fiókja volt a rendszeren, és minden felhasználóról tartalmazott néhány fontos információt:
| n | mező |
|---|---|
| 1 | felhasználónév |
| 2 | jelszó (az „x” azt jelzi, hogy a tényleges jelszót biztonsági okokból máshol tárolják) |
| 3 | UID, egyedi numerikus felhasználói azonosító |
| 4 | GID, egyedi numerikus csoportazonosító (általában ugyanaz, mint a UID) |
| 5 | felhasználói adatok (általában a felhasználó teljes neve, de más információkat is tartalmazhat) |
| 6 | home könyvtár |
| 7 | bejelentkezési shell |
A mezőket kettőspont választja el. Íme egy tipikus bejegyzés:
glennj:x:1010:1010:Glenn Jackman:/home/glennj:/usr/local/bin/fish
A fájlt rendszergazdák egy csapata kezelte, akik felelősek voltak az új fiókok létrehozásáért, a meglévő fiókok frissítéséért és a régi fiókok törléséért. A rendszergazdák voltak a Cyberspace kapuőrei, akik ügyeltek rá, hogy csak jogosult felhasználók férhessenek hozzá a rendszerhez.
Egy nap felvettek a csapatba egy új rendszergazdát, Alexet. Alex izgatottan vette át a munkát, és gyorsan megtanulta az /etc/passwd fájl minden csínját-bínját. Megtanulta, hogyan adjon hozzá új felhasználókat a rendszerhez, hogyan frissítse a felhasználói adatokat, és hogyan távolítsa el a régi felhasználókat.
Miközben Alex az /etc/passwd fájlon dolgozott, valami furcsát vett észre. Néhány felhasználónak furcsa vagy szokatlan home könyvtára volt. Egyes felhasználóknál a home könyvtár a /dev/null-ra volt állítva, másoknál pedig olyan furcsa útvonalakra, amelyek nem is léteztek.
Alex rájött, hogy ezek a felhasználók nem valódi emberek, hanem hackerek által létrehozott hamis fiókok. A hackerek megtalálták a módját, hogy kihasználjanak egy sebezhetőséget a rendszerben, és ezeket a hamis fiókokat azért hozták létre, hogy hozzáférjenek a Cyberspace-hez.
Alex tudta, hogy cselekednie kell. Awk segítségével elemezte az /etc/passwd fájlt, és írt egy szkriptet, amely azonosítja az összes hamis fiókot. Ezután a csapat többi tagjával együtt eltávolította ezeket a fiókokat, és befoltozta azt a sebezhetőséget, amely lehetővé tette a hackereknek, hogy egyáltalán létrehozzák őket.
Alex awk-használatának köszönhetően a csapat azonosítani és eltávolítani tudta a hamis fiókokat, és biztonságosabb hellyé tette a Cyberspace-t mindenki számára. A rendszergazdák továbbra is kezelték az /etc/passwd fájlt, naprakészen és biztonságban tartották, és ügyeltek rá, hogy csak jogosult felhasználók férhessenek hozzá a rendszerhez.
Most rajtad a sor, hogy te is olyan rendszergazda legyél, mint Alex.
Íme néhány további AWK szintaktikai elem, amire szükséged lesz a feladat megoldásához.
A Boolean-operátorok hasonlóak más nyelvekhez:
| művelet | példa |
|---|---|
| ÉS | expr1 && expr2 |
| VAGY | expr1 || expr2 |
| NEM | ! expr |
Egy függvény meghívása ismerős szintaxist követ:
function greet(name) {
print "Hello", name
}
BEGIN {
greet("Mary") # prints "Hello Mary"
}
Írj egy awk programot, amely kiírja a passwd fájl minden sorából az első kettősponttal elválasztott mezőt.
Írj egy awk parancsot, amely kiírja a bemeneti fájl minden rekordjának a sorszámát. Csak a sorszámot írd ki, semmilyen más információt.
A Cyberspace-ben az „érvényes” home könyvtár /home vagy /root kezdettel kezdődik.
Írd ki a bemeneti fájl azon rekordjait, amelyeknek érvénytelen a home könyvtáruk.
Írd ki azokat a rekordokat, amelyekben a home könyvtár érvényes, és a bejelentkezési shell bash.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) AWK nyelvet 3 fogalom92 feladat segítségével, valódi emberi mentorálással, mindez ingyen.