Al

Alapok ebben a kurzusban: AWK

1 feladat

A(z) Alapok fogalomról

A nyelvet AWK-nak, a programokat értelmező futtatható programot pedig awk-nak vagy gawk-nak fogjuk nevezni.

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, amely a bemenetre illeszkedik. Lehet bármilyen kifejezés is, amely igaz/hamis értéket eredményez.

A művelet egy vagy több AWK-parancs. A körülvevő kapcsos zárójelek kötelezőek.

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 értelmezi. Minden rekord nulla vagy több mezőre bomlik.

Az alapértelmezett viselkedés a következő:

  • a bemenetet rekordokra bontja, a soremelést használva „rekordelválasztóként”, így minden sor egy rekord.
  • a rekordot mezőkre bontja, a whitespace-t használva „mezőelválasztóként”, í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 elhagyható, ebben az esetben az alapértelmezett művelet az aktuális rekord kiírása.

Különleges minták

Két különleges minta van, amelyeket gyakran használnak.

  • A BEGIN a hozzá tartozó műveletet azelőtt értékeli ki, hogy bármilyen bemenetet feldolgozna.
  • A END a hozzá tartozó műveletet azután értékeli ki, hogy az összes bemenetet feldolgozta.

Mezőváltozók

A mezőkre $1, $2, $3 stb. formában hivatkozhatsz.

Az aktuális rekord a $0.

Caution

Hogy világos legyen, ezek szigorúan véve nem „változók”. A $ egy operátornak tekinthető, amely lekéri az adott mezőszám értékét. A későbbi fogalmakban mélyebben is foglalkozunk ezzel.

Íme néhány más gyakran használt beépített változó.

Beépített változók, amelyek a bemenet feldolgozását szabályozzák

  • Az RS a bemeneti rekordelválasztó. Ahogy említettük, az alapértelmezett értéke egy soremelés.
  • Az FS a bemeneti mezőelválasztó.

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

Beépített változók, amelyek információt hordoznak

Ezeket a változókat az AWK automatikusan beállítja a program végrehajtása során.

  • Az NF az aktuális rekord mezőinek számát tárolja.
    • Az utolsó mező értékének lekéré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 teljes számát tartalmazza.
  • Az FNR az aktuális bemeneti fájl aktuális rekordszámát tárolja.
    • Az NR és FNR közötti különbség szemléltetésére íme egy gyakori AWK idióma.
      NR == FNR {action}
      
      Ez azt jelenti, hogy „ha a felhalmozott rekordszám megegyezik az aktuális fájl rekordszámával”. Ez csak az első bemeneti fájl rekordjaira lehet igaz.

Igazértékűség

Az AWK ugyanazt az igazértékűség fogalmát használja, mint a C:

  • A 0 szám hamis.
  • Bármely más szám igaz.

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

  • Egy üres string "" hamis.
  • Bármely nem üres string igaz.
Note

Az AWK ugyanazt az igazértékűség fogalmát használja, mint a C

Az AWK a Bell Labs-nál született az 1970-es években, ugyanabban a környezetben, ahol a C-t kifejlesztették. A C nagy hatással volt az AWK szintaxisára.

Caution

Egy furcsaság, amire figyelni kell

  • A 0 szám hamis.
  • A nem üres "0" string igaz!

A későbbi fogalmakban részletesebben foglalkozunk az AWK adattípusaival.

Megjegyzések

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

Hogyan adjunk bemenetet az awk-nak

Az awk tud bemenetet olvasni fájlokból vagy a szabványos bemenetről. Ezek a technikák bármelyike működik.

awk '/regex/ {print $1}' file1 file2 ...

awk '/regex/ {print $1}' < file

some_command_here | awk '/regex/ {print $1}'

Példák

A Unix-szerű rendszereken a /etc/passwd felhasználói információkat tartalmaz. Minden felhasználó egy külön sorban van leírva, a mezőket kettőspontok választják el.

A felhasználónevek listázásához:

awk '
    BEGIN { FS = ":" }
    { print $1 }
' /etc/passwd

Figyeld meg, hogy a {print $1} műveletnek nincs mintája, így minden rekordra végrehajtódik.

Ha a kimenetet csak azokra a felhasználókra akarjuk korlátozni, akik a bash-t használják bejelentkezési héjként, akkor ezt tehetjük:

awk '
    BEGIN { FS = ":" }
    $7 == "/bin/bash" { print $1 }
' /etc/passwd

További példák

Íme néhány awk program, amely ugyanazokat az eredményeket produkálja, mint más gyakori Unix-parancsok.

  • Egy fájl megjelenítése

    cat file.txt
    
    awk '1' file.txt
    
  • Minták keresése egy fájlban

    grep 'foo.*bar' file.txt
    
    awk '/foo.*bar/' file.txt
    
  • Csak néhány sor megjelenítése egy fájl elején

    head -n 20 file.txt
    
    awk '
        1
        NR == 20 {exit}
    ' file.txt
    
  • Szöveg cseréje egy fájlban

    sed 's/foo/bar/' file.txt
    
    awk '{sub(/foo/, "bar")};1' file.txt
    # or more readably
    awk '
        {
            sub(/foo/, "bar")
            print
        }
    ' file.txt
    
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) Alapok fogalmat