$ awk/gawkčeská referenční příručka

Textová data. Jedním průchodem.

AWK bez zdlouhavého hledání.

Syntaxe, vestavěné proměnné, funkce i hotové recepty. Stručně, česky a s příklady, které můžete rovnou spustit.

Rychlý startawk '{ print $1 }' soubor.txt
25 referenčních tématPOSIX AWK + GNU awk

Základy

Spuštění programu

#

AWK čte vstup po záznamech, obvykle řádcích, a na každý použije pravidla vzor { akce }.

syntaxeawk 'vzor { akce }' soubor
awk '{ print $1 }' data.txt
awk -F: '{ print $1 }' /etc/passwd
gawk -v limit=10 '$3 > limit' data.txt
  • Program lze předat přímo, nebo pomocí -f program.awk.
  • Proměnné z příkazové řádky nastavujte pomocí -v ještě před čtením vstupu.

Struktura pravidla

#

Chybějící vzor znamená „vždy“. Chybějící akce znamená výchozí print $0.

syntaxevzor { příkazy }
$3 >= 100 { print $1, $3 }
/ERROR/       { count++ }
END           { print count }

BEGIN, END a BEGINFILE

#

BEGIN běží před vstupem, END po jeho zpracování. Gawk navíc nabízí BEGINFILE a ENDFILE pro každý soubor.

BEGIN { FS=","; OFS="\t"; print "jméno", "skóre" }
FNR > 1 { print $1, $3 }
END { print "řádků:", NR > "/dev/stderr" }

Vstup a výstup

Pole a oddělovače

#

$0 je celý záznam, $1…$NF jednotlivá pole. FS řídí vstupní a OFS výstupní oddělovač.

syntaxe$0 $1 $2 … $NF
BEGIN { FS="[[:space:]]+"; OFS=" | " }
{ print NR, NF, $1, $NF }
  • NF je počet polí aktuálního záznamu.
  • Přiřazení do pole, např. $2="X", přepočítá $0 s použitím OFS.

Záznamy a RS

#

RS určuje oddělovač záznamů. Prázdný RS zapne odstavcový režim; gawk podporuje regulární výraz.

BEGIN { RS=""; FS="\n" }
{ print "odstavec", NR, "má", NF, "řádků" }

print a printf

#

print přidává ORS a odděluje hodnoty pomocí OFS. printf používá formátovací řetězec.

syntaxeprintf formát, výraz, …
{ printf "%-20s %8.2f\n", $1, $2 }
END { printf "Celkem: %'d\n", NR }
  • Běžné specifikátory: %s řetězec, %d celé číslo, %f desetinné číslo, %g kompaktní číslo.
  • U printf se nový řádek nepřidává automaticky.

Přesměrování a roury

#

Výstup lze zapisovat do souboru nebo programu. Dynamicky otevírané cíle zavírejte funkcí close().

$3 == "ERR" { print > "errors.log" }
{ print $1 | "sort -u" }
END { close("sort -u") }

Vzory

Porovnání a logika

#

Vzor je výraz. Nula a prázdný řetězec jsou nepravdivé; ostatní hodnoty pravdivé.

$2 == "aktivní" && $4 >= 18
NF != 4
!seen[$1]++
  • Operátory: == != < <= > >=, logické && || !.
  • Řetězcové a číselné porovnání závisí na typu hodnoty.

Regulární výrazy

#

Operátory ~ a !~ testují shodu. Samostatný /regex/ se porovnává s $0.

/^[[:space:]]*#/ { next }
$1 ~ /^[A-Z]{2}[0-9]+$/ { print }
$0 !~ /varování|chyba/i
  • Přepínač IGNORECASE je rozšíření gawk.
  • Pro dynamický regulární výraz použijte proměnnou: $0 ~ pattern.

Rozsahový vzor

#

Dvojice vzor1, vzor2 vybírá záznamy od první shody až po následující shodu druhého vzoru.

/^START$/, /^END$/ { print }

Data

Proměnné a typy

#

Proměnné se nedeklarují. Hodnota může mít současně řetězcovou i číselnou podobu.

{ soucet += $2; text = text $1 "," }
END { print soucet, text }
  • Neinicializovaná proměnná má hodnotu 0 a prázdný řetězec.
  • Spojování řetězců nemá operátor: výrazy se prostě píší vedle sebe.

Vestavěné proměnné

#

Nejdůležitější stavové proměnné pro vstup, pole a výstup.

NR   # číslo záznamu celkem
FNR  # číslo záznamu v souboru
NF   # počet polí
FS OFS RS ORS
FILENAME ARGC ARGV
RSTART RLENGTH
SUBSEP

Asociativní pole

#

Indexem může být řetězec. Pole vzniká prvním použitím; členství testuje operátor in.

{ count[$1]++ }
END {
  for (key in count)
    print key, count[key]
}

if (id in records) print records[id]
delete records[id]
  • Pořadí for (k in pole) není v POSIX AWK definováno.
  • Celé pole v gawk smažete příkazem delete pole.

Více rozměrů

#

POSIX AWK spojuje složky indexu přes SUBSEP. Gawk nabízí i skutečná pole polí.

total[$1, $2] += $3
for (key in total) {
  split(key, parts, SUBSEP)
  print parts[1], parts[2], total[key]
}

# gawk
matrix[row][col] = value

Řízení toku

Podmínky a cykly

#

Syntaxe vychází z jazyka C. Bloky uzavírejte do složených závorek.

if (score >= 90) grade = "A"
else if (score >= 75) grade = "B"
else grade = "C"

for (i = 1; i <= NF; i++) print $i
while ((getline line < file) > 0) print line

next, nextfile a exit

#

next přeskočí zbytek pravidel pro aktuální záznam. nextfile přejde na další soubor; exit ukončí čtení.

NF == 0 { next }
FNR == 1 && $1 != "ID" { nextfile }
$1 == "STOP" { exit 2 }
  • nextfile je běžné rozšíření a součást POSIX od roku 2012.
  • Blok END se po exit provede, pokud exit nenastal uvnitř BEGIN.

Funkce

Řetězcové funkce

#

Základní výbava pro hledání, dělení, nahrazování a změnu velikosti písmen.

length(s)
substr(s, start, length)
index(s, needle)
split(s, array, regexp)
sub(regexp, repl, target)
gsub(regexp, repl, target)
match(s, regexp)
tolower(s)  toupper(s)
sprintf(format, values...)

Číselné funkce

#

Matematické funkce a převody dostupné v AWK.

int(x)  sqrt(x)  exp(x)  log(x)
sin(x)  cos(x)  atan2(y, x)
rand()  srand(seed)
strtonum(s)   # gawk

Čas v gawk

#

Gawk umí formátovat, skládat a číst časová razítka.

BEGIN {
  now = systime()
  print strftime("%Y-%m-%d %H:%M:%S", now)
  print mktime("2026 12 31 23 59 59")
}

Vlastní funkce

#

Skaláry se předávají hodnotou, pole odkazem. Lokální proměnné se tradičně píší jako přebytečné parametry.

function average(a, n,    i, sum) {
  for (i = 1; i <= n; i++) sum += a[i]
  return n ? sum / n : 0
}

Recepty

Součet podle skupiny

#

Klasická agregace tabulkových dat. Jednoduché FS="," není plnohodnotný parser CSV s uvozovkami.

awk -F, 'NR > 1 { sum[$1] += $3 }
END { for (k in sum) printf "%s,%.2f\n", k, sum[k] }' data.csv

Unikátní řádky

#

První výskyt hodnoty projde, další už ne.

awk '!seen[$0]++' soubor
awk '!seen[$1]++ { print $1 }' soubor

Spojení dvou souborů

#

První soubor se načte do pole, druhý se s ním spojí podle klíče.

awk 'NR==FNR { name[$1]=$2; next }
$1 in name { print $1, name[$1], $2 }' users.txt orders.txt

GNU awk

Užitečná rozšíření gawk

#

GNU awk přidává třídění polí, práci s časem, bitové funkce, namespaces, síťový I/O a další možnosti.

PROCINFO["sorted_in"] = "@ind_str_asc"
asort(source, dest)
asorti(source, indices)
gensub(regexp, repl, how, target)
patsplit(string, array, fieldpat)
@include "library.awk"
  • Pro přenositelné skripty použijte gawk --posix nebo --lint.
  • Informace o verzi: gawk --version.

Přepínače gawk

#

Praktické volby pro ladění, kompatibilitu a načítání programů.

-F fs, --field-separator=fs
-f file, --file=file
-v var=val, --assign=var=val
-i file, --include=file
-l lib, --load=lib
--csv
--lint
--posix
--sandbox
--profile[=file]
--dump-variables[=file]
--debug[=file]