Příkaz awk je Výkonný textový editor v Unixu/Linuxu, který prohledává text řádek po řádku, rozděluje text do polí a spouští pravidla akcí se vzory pro filtrování, transformaci a sumarizaci dat.
Vyniká v rychlých a jednoduchých postupech pro analýzu protokolů, CSV a systémových výstupů, což z něj činí nezbytný nástroj pro DevOps, SRE a zpracování dat z příkazového řádku. Pokud pracujete na linuxových serverech nebo... manage nasazení kódu, naučit se příkaz awk je jednou z nejužitečnějších dovedností, které si můžete osvojit.
Tato příručka pro začátečníky vysvětluje AWK krok za krokem s praktickými příklady, od jednoduchého tisku až po analýzu protokolů z reálného světa. Dozvíte se také tipy, které profesionálové denně používají v hostingových a cloudových prostředích.
Co je příkaz awk?
awk je řízený vzory jazyk pro zpracování dostupný na většině unixových systémů (Linux, macOS, BSD).

Pojmenován po svých tvůrcích (Aho, Weinberger, Kernighan), čte vstup řádek po řádku (záznamy), rozděluje každý do polí a spouští akce, když se vzory shodují. Je ideální pro extrakci sloupců, filtrování řádků, výpočet agregací a vytváření rychlých sestav.
Na rozdíl od příkazů sed nebo grep, awk nativně rozumí „sloupcům“ a podporuje proměnné, pole, podmíněné výrazy a funkce s dostatečným výkonem, aby nahradil malé skripty, a zároveň zůstal lehký a rychlý.
Syntaxe a základy awk
Struktura akcí vzoru
V jádru jsou awk programy seznam pravidel typu pattern { action }. awk provede akci pouze pro řádky, kde se vzor shoduje. Bez vzoru se akce spustí pro všechny řádky. Bez akce se výchozí nastavením vypíší shodné řádky.
awk 'pattern { action }' file
awk '{ print $0 }' file # print every line (default action shown explicitly)
awk '/error/' file # print lines matching regex "error"
Pole, záznamy a oddělovače
awk rozděluje každý řádek (záznam) do polí pomocí oddělovače. Ve výchozím nastavení je oddělovačem polí (FS) libovolný bílý znak. Pole jsou přístupná jako $1, $2, … a celý řádek je $0. FS můžete změnit pomocí -F nebo uvnitř bloku BEGIN.
# space-separated
awk '{ print $1, $3 }' data.txt
# comma-separated (CSV-like)
awk -F, '{ print $1, $3 }' data.csv
# set output field separator for pretty printing
awk -F, 'BEGIN{ OFS="\t" } { print $1, $3 }' data.csv
Užitečné vestavěné proměnné
Běžné vestavěné funkce, které budete používat neustále:
- NR: aktuální číslo záznamu (řádku)
- FNR: aktuální číslo záznamu v aktuálním souboru
- NF: počet polí na aktuálním řádku
- FS/OFS: oddělovač vstupních/výstupních polí
- RS/ORS: oddělovač vstupních/výstupních záznamů
- $ 0: celý řádek; $1..$NF: pole
# print line number and first field
awk '{ print NR, $1 }' file
# print last field of each line
awk '{ print $NF }' file
Začínáme: Základní příklady awk
Tisk sloupců a změna pořadí
# Reorder fields 3 and 1; add a dash between
awk '{ print $3 "-" $1 }' access.log
# Print specific columns from top output (skip header)
top -b -n1 | awk 'NR>7 { print $1, $9, $12 }'
Filtrování řádků podle hodnoty nebo regulárního výrazu
# Lines where 3rd field equals "FAILED"
awk '$3=="FAILED"' audit.log
# Requests returning 500 status code in Nginx access log (status is $9 or $8 depending on format)
awk '$9==500' /var/log/nginx/access.log
# Regex match: case-insensitive search for "timeout"
awk 'tolower($0) ~ /timeout/' app.log
Výpočet součtů, průměrů a min/max
# Sum the 2nd column
awk '{ sum += $2 } END { print sum }' metrics.txt
# Average of column 4 (skip lines starting with #)
awk '$0 !~ /^#/ { n++; total += $4 } END { if (n>0) print total/n }' data.txt
# Track min and max
awk 'NR==1{min=max=$2} { if($2<min)min=$2; if($2>max)max=$2 } END{ print "min",min,"max",max }' stats.txt
Počítání jedinečných hodnot a četností
Asociativní pole zjednodušují seskupování.
# Count requests per IP (IP assumed to be $1)
awk '{ hits[$1]++ } END { for (ip in hits) print hits[ip], ip }' access.log | sort -nr | head
Práce s CSV a vlastními oddělovači
Pro jednoduchý CSV (bez uvozovek), -F, funguje. U složitějších CSV souborů může gawkův FPAT pomoci s porovnáváním polí jako tokenů, místo aby se oddělovala podle čárek.
# Basic CSV, print columns 1 and 3
awk -F, 'BEGIN{OFS=","} {print $1, $3}' users.csv
# gawk: handle commas inside quotes (basic FPAT pattern)
gawk 'BEGIN{ FPAT = "([^,]*)|(\"[^\"]+\")"; OFS="," } { print $1, $3 }' users.csv
Použijte bloky BEGIN a END
BEGIN se spustí před čtením vstupu; Příkaz END se spustí po zpracování všech řádků, což je praktické pro záhlaví, souhrny a jednorázové nastavení FS/OFS.
awk 'BEGIN{ print "User,Count" } { c[$1]++ } END{ for (u in c) print u, c[u] }' log.txt
Praktické případy použití v reálném světě
Analýza protokolů webových serverů (Apache/Nginx)
Operační týmy běžně používají awk k Řešení problémů s provozem, výkonem a zabezpečením. Příklady předpokládají běžný kombinovaný formát protokolu; upravte čísla polí podle skutečného formátu.
# Top 10 IPs by request volume
awk '{ ip=$1; hits[ip]++ } END{ for(ip in hits) print hits[ip], ip }' access.log | sort -nr | head -10
# Top 10 requested URLs (path often $7)
awk '{ path=$7; c[path]++ } END{ for(p in c) print c[p], p }' access.log | sort -nr | head -10
# Status code distribution (status often $9)
awk '{ sc=$9; c[sc]++ } END{ for(s in c) print s, c[s] }' access.log | sort -k1,1
# Total bytes sent (bytes often $10)
awk '$10 ~ /^[0-9]+$/ { bytes += $10 } END { print "Total bytes:", bytes }' access.log
Provést výstup AWK pro řazení, uniq nebo se podívejte na rychlé reporty. V kombinaci s grep můžete předfiltrovat data nebo virtuální hostitele.
Sledování metrik systému a aplikací
# CPU usage from mpstat: average user+system
mpstat 1 5 | awk '/Average/ { print "CPU %usr+%sys:", $3 + $5 }'
# Memory usage from /proc/meminfo
awk '/MemTotal/ {t=$2} /MemAvailable/ {a=$2} END{ printf "Mem Used: %.2f%%\n", (t-a)/t*100 }' /proc/meminfo
# Slow queries over 2s in application log (assuming duration is field 6 in seconds)
awk '$6+0 > 2 { print }' app.log
Čištění a transformace dat
# Normalize case and trim extra spaces
awk '{ gsub(/^ +| +$/,""); $0=tolower($0); print }' raw.txt
# Replace delimiter: tabs to commas
awk 'BEGIN{ OFS=","; FS="\t" } { print $1,$2,$3 }' input.tsv > output.csv
Spojení awk s dalšími nástroji CLI
awk září v pipelinech. Doplňuje grep (předfiltrování), sort (řazení), uniq (deduplikace) a sed (nahrazení textu). Každý z nástrojů používejte pro jeho nejlepší využití, aby příkazy byly malé a čitelné.
Pokročilé techniky AWK
Seskupování a agregace podle klíčů
# Revenue per customer (customer_id in $1, amount in $3)
awk -F, '{ rev[$1] += $3 } END { for (id in rev) printf "%s,%0.2f\n", id, rev[id] }' sales.csv | sort -t, -k2,2nr | head
Vzory rozsahů a zpracování více souborů
Vzory rozsahu se shodují od z jedné podmínky na druhou; FNR se resetuje pro každý soubor, NR je globální napříč všemi soubory.
# Print lines between markers
awk '/BEGIN_REPORT/,/END_REPORT/' app.log
# Compare corresponding lines across files
awk 'FNR==NR { a[$1]=$2; next } { print $0, a[$1] }' left.txt right.txt
Funkce, podmíněné výrazy a pole
# Derive buckets with if/else and functions
awk '{
score=$2
if (score>=90) grade="A"
else if (score>=80) grade="B"
else grade="C"
print toupper($1), grade, length($1)
}' grades.txt
Tipy pro výkon a přenositelnost
- Preferujte jednoduché vzory a minimální volání gsub na obrovských souborech.
- Používejte číselná srovnání (např. $3+0 >= 100), aby se zabránilo sémantice řetězců.
- Nastavit FS/OFS jednou v BEGIN kvůli konzistenci.
- Pro velmi velká data, streamovat do externího řazení pro těžší řazení.
- Držte se POSIXového awk kvůli přenositelnosti; v případě potřeby použijte funkce gawk (FPAT, asort).
Běžná úskalí a osvědčené postupy
- cituji: Uzavřete programy AWK do jednoduchých uvozovek, aby se zabránilo rozbalování znaků v shellu. Uvozovky opatrně ukládejte do uvozovek.
- Čísla polí: Formáty protokolů se liší; ověřte, který sloupec ve vašem prostředí obsahuje stav, cestu nebo bajty.
- Složitost CSV: Skutečné CSV soubory obsahují uvozovky a nové řádky; pro robustní CSV zvažte gawk s FPAT nebo specializované nástroje jako Miller.
- Místní: Řazení a převod velkých a malých písmen se může lišit v závislosti na lokalitě. Pro předvídatelné chování nastavte LC_ALL=C.
- Testování: Začněte s malým vzorkem (hlavou) a postupně přidávejte podmínky.
awk vs sed vs grep: Kdy který použít
- Použijte grep k nalezení čáry, které odpovídají vzoru (rychlé filtrování).
- Použijte sed k nahrazení nebo upravte text na místě (editor streamu).
- Použijte awk k analýze polí, vypočítat hodnoty, seskupit a shrnout (strukturované zpracování).
Grep pro zúžení vstupu, awk pro výpočet, sed pro čištění výstupu. Toto zaměření na pipeline first udržuje příkazové řádky efektivní a snadno udržovatelné.
Jak awk pomáhá hostingovým a DevOps týmům
Od odhalování zneužívaných IP adres až po kvantifikaci 5xx špiček, awk vám umožňuje převést nezpracované protokoly na odpovědi během několika sekund bez nutnosti náročného nástroje. V hostingových prostředích tato rychlost urychluje reakci na incidenty, plánování kapacity a ladění výkonu, zejména při SSH připojení k produkčním serverům s omezenými zdroji.
At YouStable, Naše managed hosting a VPS Zákazníci často požadují praktickou sledovatelnost bez složitých zásobníků. awk spolu se standardními linuxovými nástroji poskytuje okamžitý vhled.
Pokud chcete proaktivní monitorování, optimalizované webové balíčky a praktickou podporu, která mluví vaším jazykem, náš tým vám může pomoci s implementací těchto technik ve velkém měřítku.
Více praktických článků od AWK, které můžete znovu použít
# Remove duplicate lines while keeping first occurrence
awk '!seen[$0]++' file.txt
# Show lines with more than N fields (e.g., malformed)
awk 'NF > 10' data.txt
# Add header to computed report
awk 'BEGIN{print "status,count"} {c[$9]++} END{for(s in c) print s "," c[s]}' access.log
# Extract date (first field) and count per day
awk '{ d=$1; gsub(/\[|\]/,"",d); day=substr(d,1,11); hits[day]++ } END{ for (k in hits) print hits[k], k }' access.log | sort -nr
Nejčastější dotazy
K čemu se v Linuxu používá příkaz awk?
awk je jazyk pro zpracování textu pro skenování souborů řádek po řádku, rozdělení řádků do polí a spouštění pravidel akcí podle vzorů. Používá se k extrakci sloupců, filtrování řádků, výpočtu statistik, generování sestav a transformaci dat, zejména z protokolů, CSV a výstupů příkazů.
Jak mohu pomocí awk vytisknout konkrétní sloupce?
Pro odkazování na pole použijte $1, $2, …. Pro soubory CSV nastavte -F a volitelně OFS pro výstup. Příklad: awk -F, 'BEGIN{OFS=””} {print $1,$3}' soubor file.csv vytiskne první a třetí sloupec oddělený čárkami.
Jaký je rozdíl mezi NR a FNR v awk?
NR je celková čára počet napříč všemi vstupními soubory; neustále se zvyšuje. FNR je počet řádků v aktuálním souboru a resetuje se na 1, když awk spustí nový soubor. Použijte vzory FNR==NR k vytvoření vyhledávacích map z prvního souboru a poté zpracujte druhý.
Dokáže awk zpracovat složité soubory CSV s uvozovkami?
Základní AWK s -F, má problém, když pole obsahují čárky v uvozovkách. gawk to vylepšuje pomocí FPAT a definuje pole jako tokeny. Pro plně robustní CSV (uvozovky s řídicími znaky, nové řádky) zvažte specializované nástroje jako Miller nebo xsv.
Co je lepší: awk, sed nebo grep?
Řeší různé problémyPříkaz grep prohledává, sed upravuje streamy a awk analyzuje a počítá. Pro strukturovanou analýzu (sloupce, seskupování, součty) je awk nejlepší. Pro nejefektivnější a nejčitelnější příkazové řádky je zkombinujte v pipeline.
Zvládnutí příkazu awk se rychle vyplatí v jakémkoli pracovním postupu v Linuxu, DevOps nebo hostingu. Mějte tyto příklady po ruce, přizpůsobte je formátům protokolů a během několika sekund proměníte surový text v užitečné informace.