A nyelvet AWK-nak, a programokat értelmező futtatható programot pedig awk-nak vagy gawk-nak fogjuk nevezni.
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.
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 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ét különleges minta van, amelyeket gyakran használnak.
BEGIN a hozzá tartozó műveletet azelőtt értékeli ki, hogy bármilyen bemenetet feldolgozna.END a hozzá tartozó műveletet azután értékeli ki, hogy az összes bemenetet feldolgozta.A mezőkre $1, $2, $3 stb. formában hivatkozhatsz.
Az aktuális rekord a $0.
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ó.
RS a bemeneti rekordelválasztó.
Ahogy említettük, az alapértelmezett értéke egy soremelés.FS a bemeneti mezőelválasztó.Ezeket a változókat gyakran a BEGIN műveletblokkban állítják be.
Ezeket a változókat az AWK automatikusan beállítja a program végrehajtása során.
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 teljes számát tartalmazza.FNR az aktuális bemeneti fájl aktuális rekordszámát tárolja.
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.Az AWK ugyanazt az igazértékűség fogalmát 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.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.
Egy furcsaság, amire figyelni kell
0 szám hamis."0" string igaz!A későbbi fogalmakban részletesebben foglalkozunk az AWK adattípusaival.
A megjegyzések a # karakterrel kezdődnek, és a sor végéig tartanak.
awk-nakAz 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}'
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
Í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