GNU/Linux >> Znalost Linux >  >> Linux

Průvodce pro začátečníky koukáním

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/firefox174660 

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
  1. Extrahování a zobrazení dat pomocí awk

  2. Základy Linuxu:Průvodce pro začátečníky k úpravám textu pomocí vim

  3. Průvodce pro začátečníky firewallem v Linuxu

  1. Praktický průvodce učením awk

  2. Průvodce pro začátečníky vytvářením přesměrování v souboru .htaccess

  3. Kompletní průvodce pro začátečníky k protokolování dockeru

  1. Průvodce pro začátečníky oprávněními pro Linux

  2. Kompletní průvodce LVM v Linuxu pro začátečníky

  3. AWK vs NAWK vs GAWK