Alapok

Alapok

Tanulófeladat

Bevezetés

Alapok

A nyelvet AWK-nak nevezzük, az AWK-programokat értelmező futtatható programot pedig awk-nak vagy gawk-nak.

Minták és műveletek

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.

Rekordok és mezők

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 bemenetet rekordokra bontja úgy, hogy a „rekordelválasztó” az újsor karakter, így minden sor egy rekord.
  • a rekordot mezőkre bontja úgy, hogy a „mezőelválasztó” a whitespace, így minden szó egy mező.

Minták és műveletek, folytatás

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ülönleges minták

Két különleges minta is gyakran használatos.

  • A BEGIN a hozzá tartozó műveletet még azelőtt kiértékeli, hogy bármilyen bemenetet feldolgoznánk.
  • Az END a hozzá tartozó műveletet az összes bemenet feldolgozása után értékeli ki.

Mezőváltozók

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ó.

A bemenet feldolgozását vezérlő beépített változók
  • Az RS a bemenet rekordelválasztója. Ahogy említettük, alapértéke az újsor karakter.
  • Az FS a bemenet mezőelválasztója.

Ezeket a változókat gyakran a BEGIN műveletblokkban állítjuk be.

Információt hordozó beépített változók

Ezeket a változókat az AWK automatikusan beállítja a program futása közben.

  • Az NF az aktuális rekord mezőinek számát tárolja.
    • Az utolsó mező értékének megszerzéséhez használd a $NF-et.
  • Az NR az aktuális rekordszámot tárolja.
    • Amikor több bemeneti fájlt dolgozunk fel, az NR az eddig feldolgozott rekordok összes számát tartalmazza.
  • Az FNR az aktuális bemeneti fájl aktuális rekordszámát tárolja.
    • Az NR és az FNR közötti különbség érzékeltetésére itt egy gyakori AWK-idióma.
      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.

Igazságértelmezés

Az AWK ugyanazt az igazságértelmezést használja, mint a C.

  • A 0 szám hamis.
  • Minden más szám igaz.

Mivel az AWK szövegfeldolgozó nyelv, az igazságértékek kiterjednek a stringekre is.

  • Az üres string "" hamis.
  • Minden nem üres string igaz.

Megjegyzések

A megjegyzések a # karakterrel kezdődnek, és a sor végéig tartanak.

Példák

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

Utasítások

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.

Note

Í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"
    }
    

1. A felhasználónevek listázása

Írj egy awk programot, amely kiírja a passwd fájl minden sorából az első kettősponttal elválasztott mezőt.

2. A sorszámok kiírása

Í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.

3. Az érvénytelen home könyvtárral rendelkező rekordok kiírása.

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.

4. A bash-t használó érvényes felhasználók kiírása

Írd ki azokat a rekordokat, amelyekben a home könyvtár érvényes, és a bejelentkezési shell bash.


Forrás

ChatGPT-beszélgetés
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
AWK Exercism

Készen állsz elkezdeni a(z) Alapok feladatot?

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.