Kompletný tutoriál awk pre Linux: praktický návod krok za krokom

Posledná aktualizácia: 15/12/2025
Autor: Isaac
  • awk je nástroj a skriptovací jazyk orientovaný na spracovanie textu po riadkoch a stĺpcoch, ideálny na filtrovanie, transformáciu a analýzu výstupov príkazy a súbory.
  • Umožňuje definovať vzory a akcie kombináciou regulárnych výrazov, špeciálnych premenných ako $0, $1, NF alebo NR a funkcií ako length, substr alebo match, čím vytvára veľmi presné filtre.
  • awk pracuje pohodlne s oddeľovačmi a poľami pomocou FS, OFS a volieb ako -F a môže formát výstupy pomocou print a printf, vykonávanie matematických operácií a správa premenných pomocou -v.
  • Je možné vytvoriť kompletné awk skripty, ktoré automatizujú zložité úlohy vrátane vyhľadávania a nahrádzania pomocou gsub, pokročilých výpočtov a generovania správ z príkazov ako ps, df alebo systémové súbory.

tutoriál k awk v Linuxe

Keď začneš brať konzolu vážne Linux Zistíte, že práca s textom nie je len o prezeraní súborov cat A to je asi tak všetko. Hneď ako sa dostanete do Záznamy Pre obrovské zoznamy procesov, výstupov príkazov alebo súborov CSV potrebujete niečo oveľa výkonnejšie na filtrovanie, transformáciu a sumarizáciu údajov bez toho, aby ste sa pri tom zbláznili.

A tu prichádza na rad awk.: príkaz, ktorý je viac než len jednoduchý filter, ale prakticky jazyk programovanie Awk je nástroj na spracovanie textu, ktorý umožňuje vyhľadávať vzory, vyberať stĺpce, vykonávať výpočty, definovať podmienky, používať premenné, slučky, funkcie a dokonca písať kompletné skripty. V tomto tutoriáli o awk pre Linux si ho krok za krokom prejdeme od základov až po pomerne pokročilé použitie, pričom zahrnieme všetky možné príklady z konzoly.

Čo je awk a na čo sa používa v Linuxe?

Awk je nástroj príkazového riadku aj skriptovací jazyk Je určený na analýzu textu štruktúrovaného v riadkoch a poliach a jeho názov pochádza z iniciálok jeho tvorcov (Aho, Weinberger a Kernighan). Používa sa od konca 70. rokov 20. storočia, ale zostáva kľúčovou súčasťou v každom prostredí. unix alebo GNU/Linux (napríklad pre Spustite starý Unix na vašom PC).

Filozofia awk je veľmi jednoduchá: Iteruje súborom (alebo výstupom príkazu) riadok po riadku, rozdeľuje každý riadok do stĺpcov podľa oddeľovača, kontroluje, či je splnená podmienka, a ak áno, vykoná akciu. Ak nezadáte podmienku, akcia sa použije na všetky riadky; ak nezadáte akciu, predvolenou akciou je výpis celého riadku.

S týmto jednoduchým mechanizmom môžete robiť skutočne neuveriteľné veci.zobrazovať iba niektoré stĺpce ps o df...až k výpočtu súčtov, filtrovaniu podľa zložitých vzorov pomocou regulárnych výrazov, nahrádzaniu textu, formátovaniu zostáv, práci so súbormi CSV alebo dokonca písaniu skriptov s niekoľkými desiatkami riadkov.

Aj keď vám awk môže trochu pripomínať grep alebo sedJeho prístup je štruktúrovanejší: riadky si predstavte ako záznamy a slová (alebo polia) ako stĺpce, s internými premennými a mini-jazykom, vďaka ktorému je ideálny na rýchle spracovanie tabuľkových údajov.

V praxi, ak chcete začať písať správne shell skripty...Je takmer nevyhnutné poznať awk spolu s ďalšími nástrojmi ako napríklad sed, grep, cut a spoločnosť. Sú základnými stavebnými kameňmi textového editora v systéme Linux.

Nainštalujte a spustite awk (gawk) na vašom systéme

Vo väčšine moderných distribúcií GNU/Linuxuawk je už štandardne nainštalovaný, zvyčajne vo variante GNU awk (gawkMôžete to skontrolovať pomocou:

awk --version

Ak ho z nejakého dôvodu nemáte nainštalovanýV Debiane, Ubuntu a derivátoch môžete použiť správcu balíkov:

sudo apt update && sudo apt install gawk

Je k dispozícii aj v systéme macOS.Môžete použiť systémovú verziu alebo nainštalovať aktualizovanú verziu pomocou Homebrew:

brew install gawk

Po nainštalovaní sa awk vždy používa s rovnakou myšlienkou.Inštrukcie posielate medzi jednoduché úvodzovky a súbor (alebo presmerujete výstup iného príkazu cez pipe). Napríklad:

awk '{print}' archivo.txt

Awk môžete použiť aj ako interpret skriptov, pričom cesta k spustiteľnému súboru je uvedená v prvom riadku súboru:

#!/usr/bin/awk -f

a potom spustením scenár priamo alebo s awk -f script.awk.

Základná syntax: vzory a akcie

Používanie awk v termináli

Minimálna štruktúra awk je:

awk 'patrón { acción }' fichero

Každý riadok súboru sa porovnáva so vzorom.Ak sa zhoduje, vykoná sa akcia v zložených zátvorkách. Ak vzor vynecháte, akcia sa použije na všetky riadky. Niekoľko kľúčových myšlienok:

Špeciálne premenné, ktoré odkazujú na každý riadok:

  • $0: kompletný rad.
  • $1, $2, $3, …: polia (stĺpce) riadku, oddelené definovaným oddeľovačom.
  • NF: počet polí v aktuálnom riadku.
  • NR: aktuálne registračné číslo (globálne číslo trate).
  • FNR: číslo riadku v aktuálnom súbore, užitočné pri spracovaní viacerých súborov.

Špeciálne pokyny:

  • BEGIN { … }: blok, ktorý sa vykoná pred prečítaním akéhokoľvek riadku.
  • END { … }: blok, ktorý sa vykoná po spracovaní všetkých riadkov.

Najbežnejšie výstupné príkazy:

  • print: vypíše argumenty oddelené výstupným oddeľovačom (OFS(predvolene medzera).
  • printfpodobné ako printf V jazyku C umožňuje detailné formátovanie bez pridania automatických zalomení riadkov.
  Kompletný návod na BitLocker To Go: bezpečné šifrovanie na USB diskoch a externých diskoch

Minimálny príklad na tlač súboru presne tak, ako je, ako keby bol cat:

awk '{print}' archivo.txt

Alebo ak chcete, aby sa zobrazovala aj dĺžka každého riadku:

awk '{print length, "\t", $0}' archivo.txt

Práca so stĺpcami a oddeľovačmi v awk

Jedným z hlavných použití awk je manipulácia so stĺpcami. z výstupov príkazov, ako napríklad ps, df alebo súbory ako /etc/passwdV predvolenom nastavení awk považuje akúkoľvek medzeru alebo tabulátor za oddeľovač, ale môžete použiť prakticky akýkoľvek oddeľovač.

Vyberte konkrétne stĺpce

Predstavte si odchod ps s niekoľkými stĺpcami (PID, TTY, TIME, CMD…)Ak chcete vidieť iba PID, jednoducho:

ps | awk '{print $1}'

Ak vás zaujíma druhý stĺpec (napríklad TTY):

ps | awk '{print $2}'

A ak chcete preskočiť prvý riadok (hlavičku)Môžete filtrovať podľa registračného čísla:

ps | awk 'NR>1 {print $1}'

Myšlienka je veľmi jednoduchá.: každé číslo za symbolom $ Odkazuje na príslušný stĺpec, vždy vzhľadom na aktuálny oddeľovač.

Zmeňte oddeľovač pomocou -F a pomocou FS

Mnohé systémové súbory nie sú oddelené medzerami.ale inými symbolyKlasika je /etc/passwdkde sú polia oddelené :Na spracovanie súboru podľa stĺpcov máte dve možnosti: možnosť -F na príkazovom riadku alebo v premennej FS vnútri bloku BEGIN.

Použitie -F na príkazovom riadku:

cat /etc/passwd | awk -F ":" '{print $1}'

Tento príklad zobrazuje iba používateľské mená (prvé pole), pretože oddeľovač je teraz :Ak chcete aj UID a GID (polia 3 a 4), jednoducho:

cat /etc/passwd | awk -F ":" '{print $1, $3, $4}'

Problém s týmto príkazom je, že výstup je zlepený. Ak nedefinujete explicitné oddeľovače, môžete medzery alebo tabulátory pridať manuálne:

cat /etc/passwd | awk -F ":" '{print $1 " " $3 " " $4}'

Ak chcete tabuľkovejší výsledokmôžete použiť \t vložiť karty:

cat /etc/passwd | awk -F ":" '{print $1 "\t" $3 "\t" $4}'

Alternatíva s FS v bloku BEGIN Umožňuje vám nastaviť oddeľovač v samotnom awk skripte:

cat /etc/passwd | awk 'BEGIN { FS=":" } {print $1 "\t" $3 "\t" $4}'

Oba prístupy sú funkčne ekvivalentnéhoci používa BEGIN {FS=...} Zvyčajne je to čistejšie, keď píšete opakovane použiteľné skripty .awk.

FS a OFS: vstupné a výstupné oddeľovače

Okrem FS (oddeľovač polí) má awk aj OFS (oddeľovač výstupných polí).ktorý definuje, ako sú polia oddelené pri použití print s čiarkami:

cat /etc/passwd | awk 'BEGIN { FS=":"; OFS=" - " } {print $1, $3, $4}'

V tomto prípade čítate s : ale píšeš s - , čím sa vygeneruje výstup podobný tomuto:

root - 0 - 0
daemon - 1 - 1
...

Táto kombinácia FS/OFS je veľmi užitočná na „preformátovanie“ údajov.Napríklad na konverziu z jedného formátu do druhého alebo na prípravu čitateľných výstupov, ktoré potom exportujete do iného systému.

Získajte posledné pole s $NF (a predchádzajúce)

V mnohých výstupoch príkazovPole, ktoré vás zaujíma, je na konci, ale presný počet stĺpcov sa líši. Tam sa nachádza $NF (Počet polí) vám zjednodušuje život: vždy je to posledné pole v aktuálnom riadku.

Napríklad, v /etc/shells Platné cesty k shellu sa zobrazujú na konci každého riadkuNiekedy v druhom stĺpci, niekedy v treťom atď. Ak chcete vypísať iba názov shellu (časť za posledným lomítkom):

awk -F "/" '/^\// {print $NF}' /etc/shells

Ak potom chcete zachovať iba jedinečné hodnoty (bez duplikátov), ​​môžete reťaziť s uniq:

awk -F "/" '/^\// {print $NF}' /etc/shells | uniq

A ak ťa zaujíma predposledný prvok cesty (napríklad predchádzajúci adresár), môžete použiť $(NF-1) o $(NF-2):

awk -F "/" '/^\// {print $(NF-1)}' /etc/shells

awk -F "/" '/^\// {print $(NF-2)}' /etc/shells

Filtrovanie riadkov pomocou vzorov, dĺžky a logických podmienok

Awk je skvelý, keď sa chcete držať iba určitých riadkov. na základe textových vzorov, konkrétnych stĺpcov alebo číselných podmienok. Kombinujte regulárne výrazy, logické operátory a funkcie, ako napríklad length na výrobu veľmi presných filtrov.

Filtrovať podľa vzorov a regulárnych výrazov

Najpriamejší spôsob filtrovania podľa obsahu je umiestniť regulárny výraz medzi lomítka. Tesne pred kľúčmi:

awk '/patrón/ {print}' archivo.txt

Napríklad s odchodom df Môžete zobraziť iba riadky, ktoré začínajú lomítkom (pripojené súborové systémy):

df | awk '/^\// {print}'

Ak chcete konkrétny oddiel, napríklad /dev/sda5:

df | awk '/^\/dev\/sda5/ {print}'

Môžete tiež filtrovať podľa vzorov na začiatku alebo na konci riadku použitie ^ y $:

awk '/^tmpfs/ {print}' archivo.txt
awk '/\/shm$/ {print}' archivo.txt

A skombinujte niekoľko kritérií s logickým operátorom &&Napríklad riadky, ktoré začínajú na tmpfs a končia v /dev/shm:

df | awk '/\/shm$/ && /^tmpfs/ {print}'

Filtrovať podľa stĺpcov a zobraziť iba to, čo vás zaujíma

Často chcete filtrovať nielen riadky, ale aj stĺpce.Pokračovanie s df -h, môžete zobraziť iba skutočné súborové systémy (^/) a potom ponechajte stĺpce 1, 2 a 3:

  Ako zvýšiť hlasitosť slúchadiel pre iPhone - Ekvalizácia

df -h | awk '/^\// {print $1 "\t" $2 "\t" $3}'

Awk vám dokonca umožňuje pracovať s poľami za chodu.Napríklad, pridajte stĺpce 2 a 3 (použité + dostupné), aby ste videli vypočítanú „celkovú kapacitu“:

df -h | awk '/^\// {print $1 "\t" $2 + $3}'

Ak chcete na koniec výsledku pridať doslovnú jednotku „G“:

df -h | awk '/^\// {print $1 "\t" $2 + $3 "G"}'

Filtrovať podľa dĺžky riadku pomocou funkcie length()

Funkcia length() meria počet znakov v reťazciNormálne sa používa s $0 (plný riadok), ale môžete ho použiť aj s konkrétnym stĺpcom.

Ak chcete zobraziť iba riadky /etc/shells s viac ako 9 znakmi:

awk 'length($0) > 9' /etc/shells

Ak chcete vidieť dĺžku každého riadku:

awk '{print length, "\t", $0}' /etc/shells

Môžete tiež filtrovať podľa dĺžky a potom vytlačiť iba dĺžku.:

awk 'length($0) > 9 {print length}' /etc/shells

Kombinujte viacero podmienok pomocou && a if

Okrem použitia regulárnych výrazov na začiatkuKompletné podmienky môžete zapísať v rámci bloku pomocou if, porovnávacie a logické operátory.

Napríklad zobrazenie iba riadkov df -h ktoré začínajú t a ktorého stĺpec 6 má viac ako 8 znakov:

df -h | awk '/^t/ && length($6) > 8 {print $0}'

Ďalším typickým prípadom je vyhľadávanie procesov podľa posledného poľa (príkaz vykonaný) na výstupe ps -efPosledné pole je $NFTakže môžete použiť:

ps -ef | awk '{ if ($NF == "firefox") print $0 }'

Ak vám záleží len na PID a príkaze:

ps -ef | awk '{ if ($NF == "firefox") print $2, $NF }'

Riadiace čiary s NR, rozsahmi a dĺžkou poľa

Premenná NR (počet záznamov) Počíta, koľko riadkov bolo doteraz prečítaných (globálne). To umožňuje bežné veci, ako je preskakovanie hlavičiek, tlač konkrétnych rozsahov riadkov alebo zobrazenie iba prvého riadku.

Počítať riadky a zobraziť iba prvý alebo druhý

Ak chcete spočítat celkový počet riadkov v súbore nepoužívaný wc -l môžete urobiť:

awk 'END {print NR}' archivo.txt

Ak chcete vytlačiť iba prvý riadok:

awk 'NR==1 {print}' archivo.txt

A zobraziť iba druhý riadok:

awk 'NR==2 {print}' archivo.txt

Tlač od konkrétneho riadku alebo rozsahu

Zobraziť všetky riadky od tretieho ďalej Môžete použiť jednoduchú podmienku s > o >=:

ps -aux | awk 'NR>2 {print}'

Ak chcete rozsah, napríklad riadky 2 až 4 en /etc/shells:

cat /etc/shells | awk 'NR==2, NR==4 {print $0}'

Číslo riadku môžete vytlačiť aj vedľa obsahu:

cat /etc/shells | awk 'NR==2, NR==4 {print NR, $0}'

Dĺžka špecifických polí

Okrem merania dĺžky celých čiarMôžete skontrolovať dĺžku konkrétneho stĺpca. Napríklad, ak chcete zistiť, koľko znakov má súborový systém (stĺpec 1) vo výstupe df -h:

df -h | awk '{print length($1) "\t" $1}'

Ak chcete preskočiť hlavičku (prvý riadok), dodáva NR>1:

df -h | awk 'NR>1 {print length($1) "\t" $1}'

Užitočné funkcie: substr, match, RSTART a RLENGTH

Awk obsahuje dobrý výber textových funkciíDva z najvýkonnejších nástrojov pre pokročilé vyhľadávanie sú substr y match, pričom posledné menované sú sprevádzané premennými RSTART y RLENGTH.

Orezanie textu pomocou substr()

Funkcia substr(cadena, inicio) o substr(cadena, inicio, longitud) Umožňuje vám extrahovať podreťazce. Napríklad odstrániť prvých 5 znakov z každého riadku /etc/shells:

cat /etc/shells | awk '{print substr($0, 5)}'

Ak nechcete spracovať prvý riadok (napríklad komentár), môžete použiť NR:

cat /etc/shells | awk 'NR>1 {print substr($0, 5)}'

Všimnite si, že prvým parametrom je reťazec (zvyčajne $0) a druhý označuje, ktorý znak chcete začať zobrazovať.

Vyhľadávanie vzorov pomocou metód match(), RSTART a RLENGTH

Funkcia match(cadena, /regex/) vyhľadať regulárny výraz v reťazciAk sa nájde zhoda, vráti počiatočnú pozíciu (na základe 1) a naplní dve premenné:

  • RSTART: pozícia, kde začína nájdený vzor.
  • RLENGTH: dĺžka zápasu.

Napríklad pre všetky riadky ps -aux ktoré obsahujú „cpu“Môžete zobraziť celú čiaru a polohu, kde sa vzor nachádza:

ps -aux | awk 'match($0, /cpu/) {print $0 " Contiene \"cpu\" en la posición " RSTART}'

Ak chcete vedieť aj rozmery nájdeného vzoru, stačí použiť RLENGTH na východe:

ps -aux | awk 'match($0, /cpu/) {print $0 " Posición=" RSTART " Longitud=" RLENGTH}'

Tento typ vyhľadávania sa široko používa v textovej analýze a bioinformatike.Napríklad v súboroch FASTA, kde vás zaujíma lokalizácia špecifických motívov v sekvenciách.

Matematické operácie a premenné v awk

Awk sa neobmedzuje len na zobrazovanie textu: umožňuje vykonávať numerické operácie priamo s poľami, internými premennými alebo hodnotami, ktoré zadáte z príkazového riadku alebo z prostredia shellu.

  Metódy na obnovenie úplne odstránených obrázkov z iPhone

Definujte premenné s -vy a použite ich v BEGIN

Premenné môžete deklarovať s voľbou -v pri volaní awkNapríklad vynásobenie dvoch pevných čísel:

awk -v a="10" -v b="20" 'BEGIN {print "La multiplicación de a x b es", a*b}'

Je tiež možné odovzdať hodnoty premenných z vášho shelluAk v bash urobíte:

a=1.5
b=4

Potom ich môžete použiť v awk takto:

awk -v a="$a" -v b="$b" 'BEGIN {print "La multiplicación de a x b es", a*b}'

Blok BEGIN sa tu používa, pretože nespracovávame žiadny súbor.Chceme spustiť kód iba raz a zobraziť výsledok.

Matematické funkcie: sqrt a for cykly

Awk obsahuje niekoľko štandardných matematických funkcií.Ako sqrt() pre druhé odmocniny. Napríklad druhá odmocnina zo 400:

awk 'BEGIN {print sqrt(400)}'

Môžete to tiež kombinovať s cyklusmi for na vytvorenie kompletných zoznamov:

awk 'BEGIN { for(i=1; i<=10; i++) print "La raíz cuadrada de", i*i, "es", i }'

Alebo prechádzajte desatinnými hodnotami od 0 do 1 v malých krokoch:

awk 'BEGIN { for(i=0; i<=1; i=i+0.00001) print "La raíz cuadrada de", i*i, "es", i }'

Vďaka týmto typom štruktúr je awk veľmi podobný tradičnému jazykuhoci jeho prirodzeným prostredím zostáva stĺpcový formát.

Písanie a spúšťanie kompletných skriptov v awk

Keď sa príkazy awk začnú predlžovať Ak chcete opakovane použiť zložité transformácie, rozumné je uložiť ich do súboru skriptu s príponou . .awk (aj keď to nie je povinné).

Typický príklad zahŕňa spracovanie výstupu z df zobraziť iba určité položky, ktoré spĺňajú podmienky týkajúce sa dostupného miesta a výsledky naformátovať ako malú tabuľku.

Predstavte si, že chcete nasledovné:

  • Zobraziť iba súborové systémy, ktorých názov začína na „t“ (napríklad tmpfs).
  • Filtrujte tie, ktorých dostupná kapacita (stĺpec 4) je väčšia ako 6000K.
  • Vypíšte iba jednotku (stĺpec 1) a súčet stĺpcov 2 a 3 ako približný celkový priestor.

Môžete si vytvoriť skript s názvom capacidad.awk s podobným obsahom (upravené a zjednodušené):

#!/usr/bin/awk -f
BEGIN { printf "%s\n", "Voy a extraer las partes que me interesan del comando df" }
BEGIN { printf "%s\t%s\n", "Unidad", "Capacidad disponible" }
/^t/ && $4 > 6000 {print $1 "\t" $2 + $3 "K"}

A potom ho spustite reťazením výstupu df.:

df | awk -f capacidad.awk

Ak chcete vylepšiť vzhľad stola, môžete nahradiť print podľa printf a používať formáty ako %-12s (text zarovnaný vľavo, 12 znakov) alebo %-23d (Desatinné číslo s 23 znakmi). Toto vám dáva dokonalú kontrolu nad zarovnaním stĺpcov.

Nájsť a nahradiť text pomocou funkcie gsub()

Awk dokáže aj nahrádzať text podobne ako by ste urobili so sed, pomocou funkcie gsub() (globálna náhrada).

Všeobecná syntax je:

gsub("texto_o_regex_a_buscar", "texto_de_reemplazo", destino)

Napríklad, predpokladajme súbor geekland.txt s textom „Geekland je najlepší technologický blog“ a chcete zmeniť začiatočné G na g:

awk '{ gsub("G", "g", $0); print $0 }' geekland.txt

Ak nezadáte tretí parameter, vyhľadávanie sa vykoná na $0 v predvolenom nastaveníJe však veľmi bežné obmedziť nahradenie na jeden stĺpec:

df -h | awk '{ gsub("M", "G", $2); print $2 }'

V tomto prípade sme v stĺpci 2 zmenili iba jednotku M na G.Ak chcete zobraziť aj stĺpec 1 správne zarovnaný, môžete to skombinovať s printf:

df -h | awk '{ gsub("M", "G", $2); printf "%-12s %-12s\n", $1, $2 }'

Tento vzorec „Upravím stĺpec a potom vytlačím formátovaný“ Je to mimoriadne užitočné pri vytváraní prehľadov, migráciách údajov alebo rýchlom čistení výstupu príkazov.

Ďalšie použitie: mačka infikovaná steroidmi a vykonávanie príkazov

Aj keď sa to môže zdať hlúpeawk môže fungovať ako cat Vylepšené, pretože dokáže zobraziť súbor a zároveň pridať ďalšie informácie (čísla riadkov, dĺžky atď.).

Triviálne použitie by bolo:

awk '{print}' functions.php

Môžete však tiež očíslovať čiary alebo použiť ľubovoľný filter. bez nutnosti použitia akýchkoľvek ďalších nástrojov.

Ďalším zaujímavým faktom je, že awk dokáže vykonávať systémové príkazy podľa funkcie system()Napríklad, ak chcete zobraziť aktuálny adresár:

awk 'BEGIN { system("pwd") }'

Toto nie je najbežnejšia prax v jednoduchých skriptoch.Ale je dobré vedieť, že existuje, keď vytvárate zložitejšie nástroje založené na awk.

Awk sa v Linuxe stáva švajčiarskym armádnym nožíkom pre textUmožňuje vám filtrovať riadky, vyberať a kombinovať stĺpce, nahrádzať fragmenty, merať dĺžky, vyhľadávať vzory, sčítavať polia, generovať malé formátované zostavy a dokonca vytvárať kompletné skripty, ktoré spracovávajú výstup iných príkazov. Keď si to osvojíte, stane sa nevyhnutným nástrojom vždy, keď pracujete s... terminál a štruktúrované dáta.

Spustite tutoriál Ancient Unix
Súvisiaci článok:
Ako spustiť starší systém UNIX na vašom PC: SIMH, Docker, V7/V8, BSD a ďalšie