25 referenčních témat POSIX AWK + GNU awk
Základy AWK čte vstup po záznamech, obvykle řádcích, a na každý použije pravidla vzor { akce }.
syntaxe awk 'vzor { akce }' soubor
awk '{ print $1 }' data.txt
awk -F: '{ print $1 }' /etc/passwd
gawk -v limit=10 '$3 > limit' data.txtKopírovat 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. Chybějící vzor znamená „vždy“. Chybějící akce znamená výchozí print $0.
syntaxe vzor { příkazy }
$3 >= 100 { print $1, $3 }
/ERROR/ { count++ }
END { print count }Kopírovat 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" }Kopírovat Vstup a výstup $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 }Kopírovat 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. 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ů" }Kopírovat print přidává ORS a odděluje hodnoty pomocí OFS. printf používá formátovací řetězec.
syntaxe printf formát, výraz, …
{ printf "%-20s %8.2f\n", $1, $2 }
END { printf "Celkem: %'d\n", NR }Kopírovat 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. 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") }Kopírovat Vzory Vzor je výraz. Nula a prázdný řetězec jsou nepravdivé; ostatní hodnoty pravdivé.
$2 == "aktivní" && $4 >= 18
NF != 4
!seen[$1]++Kopírovat Operátory: == != < <= > >=, logické && || !. Řetězcové a číselné porovnání závisí na typu hodnoty. 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/iKopírovat Přepínač IGNORECASE je rozšíření gawk. Pro dynamický regulární výraz použijte proměnnou: $0 ~ pattern. Dvojice vzor1, vzor2 vybírá záznamy od první shody až po následující shodu druhého vzoru.
/^START$/, /^END$/ { print }Kopírovat Data 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 }Kopírovat 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. 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
SUBSEPKopírovat 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]Kopírovat Pořadí for (k in pole) není v POSIX AWK definováno. Celé pole v gawk smažete příkazem delete pole. 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] = valueKopírovat Řízení toku 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 lineKopírovat 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 }Kopírovat 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 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...)Kopírovat 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) # gawkKopírovat 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")
}Kopírovat 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
}Kopírovat Recepty 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.csvKopírovat První výskyt hodnoty projde, další už ne.
awk '!seen[$0]++' soubor
awk '!seen[$1]++ { print $1 }' souborKopírovat 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.txtKopírovat GNU awk 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"Kopírovat Pro přenositelné skripty použijte gawk --posix nebo --lint. Informace o verzi: gawk --version. 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]Kopírovat