gawk je GNU implementace programovacího jazyka Awk, který byl poprvé vyvinut pro operační systém UNIX v 70. letech 20. století. Programovací jazyk Awk se specializuje na formátování dat v textových souborech, zejména textových dat organizovaných do sloupců.
Pomocí programovacího jazyka Awk můžete s velkou flexibilitou manipulovat nebo extrahovat data, generovat zprávy, porovnávat vzory, provádět výpočty a další. Awk vám umožňuje provádět poněkud obtížné úkoly s jediným řádkem kódu. Dosažení stejných výsledků pomocí tradičních programovacích jazyků, jako je C nebo Python, by vyžadovalo další úsilí a mnoho řádků kódu.
gawk
také odkazuje na nástroj příkazového řádku, který je standardně k dispozici u většiny distribucí Linuxu. Většina distribucí také poskytuje symbolický odkaz pro awk
ukazující na gawk
. Pro zjednodušení budeme od nynějška tuto utilitu označovat pouze jako awk
.
awk
zpracovává data přímo ze standardního vstupu - STDIN. Běžným vzorem je přesměrování výstupu jiných programů do awk
extrahovat a tisknout data, ale awk
může také zpracovávat data ze souborů.
V tomto článku použijete awk
analyzovat data ze souboru se sloupci oddělenými mezerou. Začněme kontrolou ukázkových dat.
Příklad údajů
Pro příklady v této příručce použijeme výstup příkazu ps ux
uloženy v souboru psux.out
. Zde je ukázka dat v souboru:
$ head psux.outUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDricardo 1446 0,0 0,2 21644 11536 ? Ss Sep10 0:00 /usr/lib/systemd/systemd --userricardo 1448 0.0 0.1 49212 5848 ? S 10. září 0:00 (sd-pam)ricardo 1459 0,0 0,1 447560 7148 ? Sl Sep10 0:00 /usr/bin/gnome-keyring-daemon --daemonize --loginricardo 1467 0.0 0.1 369144 6080 tty2 Ssl+ Sep10 / bin-land 0:0000000000000000000000000000000000000 1469 0,0 0,1 277692 4112 ? Ss Sep10 0:00 /usr/bin/dbus-broker-launch --scope userricardo 1471 0.0 0.1 6836 4408 ? S. SEP10 0:00 DBUS-BROKER-Log 4-Controller 11-Machine-ID 16355057C7274843823DD747F8E2978B-MAX-BYTES 1000000000000-MAX-MAX-MAX-MAX-MAX-MAX-MAX-MAX-MAX-MAX-MAX-MAX-MAX-MAX-MAX-MAX FDS 00 /usr/libexec/gnome-session-binaryricardo 1531 0,0 0,1 297456 4280 ? Ssl Sep10 0:00 /usr/libexec/gnome-session-ctl --monitorricardo 1532 0.0 0.3 1230908 12920 ? S
Zde si můžete stáhnout kompletní soubor pomocí tohoto příkazu:
$ curl -o psux.out https://gitlab.com/-/snippets/2013935/raw\?inline\=false
Pokud se rozhodnete použít výstup ps ux
ve vašem systému upravte hodnoty uvedené v příkladech tak, aby odpovídaly vašim výsledkům.
Dále použijeme awk
pro zobrazení dat ze vzorového souboru.
Základní použití
Základní awk
program se skládá ze vzoru následovaného akcí uzavřenou ve složených závorkách. awk
můžete poskytnout program obslužný program vložený tak, že jej uzavřete do jednoduchých uvozovek, jako je tento:
$ awk 'pattern { action }'
awk
zpracovává vstupní data – standardní vstup nebo soubor – řádek po řádku, přičemž provádí danou akci pro každý řádek – nebo záznam – který odpovídá vzoru. Pokud je vzor vynechán, awk
provede akci na všech záznamech. Akce může být tak jednoduchá jako tisk dat z řádku nebo tak složitá jako celý program. Chcete-li například vytisknout všechny řádky z ukázkového souboru, použijte tento příkaz:
$ awk '{ print }' psux.outUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDricardo 1446 0,0 0,2 2153644 Ss Sep10 0:00 /usr/lib/systemd/systemd --user.... OUTPUT ZKRÁCENÝ ....
I když tento příklad není ve skutečnosti užitečný, ilustruje awk
základní použití příkazu.
Pokud používáte příkaz ps ux
na vašem počítači můžete jeho výstup zpracovat přímo do awk
, místo zadání názvu vstupního souboru:
$ ps ux | awk '{ print }'
Dále použijeme awk
schopnosti zpracování sloupců pro extrahování části dat ze vzorového souboru.
Tisk polí
Síla awk
začne být zřejmé, když použijete jeho funkce zpracování sloupců. awk
automaticky rozdělí každý řádek – nebo záznam – do polí. Ve výchozím nastavení používá mezera znak pro oddělení jednotlivých polí, ale můžete to změnit zadáním parametru příkazového řádku -F
následovaný požadovaným oddělovačem.
Po rozdělení awk
přiřadí každé pole číslované proměnné počínaje znakem $
. Například první pole je $1
, druhý 2 $
, a tak dále. Speciální proměnná $0
obsahuje celý záznam před rozdělením.
Pomocí proměnných polí můžete extrahovat data ze vstupu. Chcete-li například vytisknout pouze název příkazu ze vzorového souboru, použijte proměnnou $11
protože název příkazu je jedenáctý sloupec na každém řádku:
$ awk '{ print $11 }' psux.outCOMMAND/usr/lib/systemd/systemd(sd-pam)/usr/bin/gnome-keyring-daemon.... VÝSTUP ZKRÁCEN ....
Můžete také vytisknout více polí tak, že je oddělíte čárkami. Chcete-li například vytisknout název příkazu a využití CPU ve sloupci tři, použijte tento příkaz:
$ awk '{ print $11, $3 }' psux.outCOMMAND %CPU/usr/lib/systemd/systemd 0.0(sd-pam) 0.0/usr/bin/gnome-keyring-daemon 0.0... OUTPUT ZKRÁCENÝ ....
Nakonec použijte vestavěný printf
funkci formátovat výstup a zarovnat sloupce. Napravo od prvních sloupců poskytněte výplň o délce 40 znaků, aby bylo možné umístit delší názvy příkazů:
$ awk '{printf ("%-40S%s \ n", $ 11, $ 3)}' Psux.outCommand%CPU/usr/Systemd/Systemd 0,0 (SD-PAM) 0,0/usr /bin/gnome-keyring-daemon 0.0/usr/libexec/gdm-wayland-session 0.0.... ZKRÁCENÝ VÝSTUP ....
Nyní, když můžete manipulovat a extrahovat jednotlivá pole z každého záznamu, pojďme použít funkci vzoru k filtrování záznamů.
[ Také by se vám mohlo líbit: Manipulace s textem na příkazovém řádku pomocí sed ]
Shoda vzorů
Kromě manipulace s poli, awk
umožňuje filtrovat, na kterých záznamech se mají provádět akce prostřednictvím výkonné funkce porovnávání vzorů. V jeho nejzákladnějším použití zadejte regulární výraz uzavřený lomítkem /
znaky, které odpovídají záznamům. Chcete-li například filtrovat podle záznamů, které odpovídají firefoxu , použijte /firefox/
:
$ awk '/firefox/ { tisk $11, $3 }' psux.out/usr/lib64/firefox/firefox 66.2/usr/lib64/firefox/firefox 8.3/usr/lib64/firefox/firefox 15.6/ usr/lib64/firefox/firefox 9.0/usr/lib64/firefox/firefox 31.5/usr/lib64/firefox/firefox 20.6/usr/lib64/firefox/firefox 31.0/usr/lib64/firefox/firefox/60. /firefox 0.0/usr/lib64/firefox/firefox 0.0/usr/lib64/firefox/firefox 0.0/usr/lib64/firefox/firefox 0.0/usr/lib64/firefox/firefox 0.0
Jako kritéria shody vzoru můžete také použít pole a srovnávací výraz. Chcete-li například vytisknout data z procesu, který odpovídá PID 6685, porovnejte pole $2
, takto:
$ awk '$2==6685 { tisk $11, $3 }' psux.out/usr/lib64/firefox/firefox 0.0
awk
je dostatečně chytrý, aby porozuměl numerickým polím, což vám umožňuje používat relativní srovnání, jako je větší nebo menší než. Chcete-li například zobrazit všechny procesy, které využívají více než 5 % CPU , použijte $3> 5
:
$ awk '$3> 5 { tisk $11, $3 }' psux.out/usr/bin/gnome-shell 5.1/usr/lib64/firefox/firefox 66.2/usr/lib64/firefox/firefox 8.3/ usr/lib64/firefox/firefox 15.6/usr/lib64/firefox/firefox 9.0/usr/lib64/firefox/firefox 31.5/usr/lib64/firefox/firefox 20.6/usr/lib64/firefox/0
Vzory můžete kombinovat s operátory. Chcete-li například zobrazit všechny procesy, které odpovídají firefoxu a využívají více než 5 % CPU , zkombinujte oba vzory s &&
operátor pro logický AND
:
$ awk '/firefox/ &&$3> 5 { tisk $11, $3 }' psux.out/usr/lib64/firefox/firefox 66.2/usr/lib64/firefox/firefox 8.3/usr/lib64/firefox /firefox 15.6/usr/lib64/firefox/firefox 9.0/usr/lib64/firefox/firefox 31.5/usr/lib64/firefox/firefox 20.6/usr/lib64/firefox/firefox 31.0
A konečně, protože používáte shodu se vzorem, awk
již netiskne řádek záhlaví. Můžete přidat svůj vlastní řádek záhlaví pomocí BEGIN
vzor pro provedení jedné akce před zpracováním jakýchkoli záznamů:
$ awk 'BEGIN { printf("%-26s %s\n", "Command", "CPU%")} $3> 10 { print $11, $3 }' psux.outCommand CPU%/usr /lib64/firefox/firefox 66.2/usr/lib64/firefox/firefox 15.6/usr/lib64/firefox/firefox 31.5/usr/lib64/firefox/firefox 20.6/usr/lib64/firefox/firefox 31.0
Dále pojďme manipulovat s daty v jednotlivých polích.
Manipulace s polem
Jak jsme probrali v předchozí části, awk
rozumí číselným polím. To umožňuje provádět manipulaci s daty, včetně numerických výpočtů. Zvažte například tisk využití paměti ve sloupci šest pro všechny firefox procesy:
$ awk '/firefox/ { tisk $11, $6 }' psux.out/usr/lib64/firefox/firefox 301212/usr/lib64/firefox/firefox 118220/usr/lib64/firefox/firefox/1684 usr/lib64/firefox/firefox 101520/usr/lib64/firefox/firefox 194336/usr/lib64/firefox/firefox 111864/usr/lib64/firefox/firefox 163440/usr/refox/liboxfilibox4/firefox /firefox 174636/usr/lib64/firefox/firefox 37264/usr/lib64/firefox/firefox 30608/usr/lib64/firefox/firefox 174636/usr/lib64/firefox/firefox
174660
Příkaz ps ux
zobrazuje využití paměti v kilobajtech, což je obtížně čitelné. Pojďme to převést na megabajty ponořením hodnoty pole o 1024:
$ awk '/firefox/ { tisk $11, $6/1024 }' psux.out/usr/lib64/firefox/firefox 294.152/usr/lib64/firefox/firefox 115.449/usr/lib64/firefox/fi 164.52/usr/lib64/firefox/firefox 99.1406/usr/lib64/firefox/firefox 189.781/usr/lib64/firefox/firefox 109.242/usr/lib64/firefox/firefox/95564.63. /firefox/firefox 170.543/usr/lib64/firefox/firefox 36.3906/usr/lib64/firefox/firefox 29.8906/usr/lib64/firefox/firefox 170.543/usr/lib64/lib64/libfirefox77
Čísla můžete také zaokrouhlit nahoru a přidat příponu MB pomocí printf
zlepšit čitelnost:
$ awk '/firefox/ { printf("%s %4.0f MB\n", $11, $6/1024) }' psux.out/usr/lib64/firefox/firefox 294 MB/usr/ lib64/firefox/firefox 115 MB/usr/lib64/firefox/firefox 165 MB/usr/lib64/firefox/firefox 99 MB/usr/lib64/firefox/firefox 190 MB/usr/lib64/firefox/firefox/firefox lib64/firefox/firefox 160 MB/usr/lib64/firefox/firefox 38 MB/usr/lib64/firefox/firefox 171 MB/usr/lib64/firefox/firefox 36 MB/usr/lib64/firefox/3 MB/firefox lib64/firefox/firefox 171 MB/usr/lib64/firefox/firefox 171 MB
Nakonec zkombinujte tento nápad s BEGIN
a END
vzory pro pokročilejší manipulaci s daty. Spočítejme si například celkové využití paměti pro všechny firefox procesy definováním proměnné součet v BEGIN
akce, přidání hodnoty ze šestého sloupce $6
pro každý řádek, který odpovídá firefoxu na součet a poté ji vytiskněte s END
akce v megabajtech:
$ awk 'BEGIN { sum=0 } /firefox/ { sum+=$6 } END { printf("Celková paměť Firefoxu:%.0f MB\n", suma/1024) }' psux.outTotal Firefox paměť:1747 MB
[ Stáhnout nyní:Průvodce systémového administrátora skriptováním v Bash. ]
Co bude dál?
gawk
je výkonný a flexibilní nástroj pro zpracování textových dat, zejména dat uspořádaných do sloupců. Tento článek poskytuje několik užitečných příkladů použití tohoto nástroje k extrakci a manipulaci s daty, ale gawk
dokáže mnohem víc. Další informace o gawk
, prostudujte si manuálové stránky vaší distribuce Linuxu.
Jazyk Awk má mnohem více zdrojů, než jsme prozkoumali v této příručce. Podrobné informace o něm naleznete v oficiální uživatelské příručce GNU Awk.
Linux