Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Software
Obcování s ďáblem 27: Awk a výrazy
7. února 2002, 00.00 | Jak jsme si slíbili minule, nejprve se velmi stručně seznámíme s několika standardními proměnnými awk, a pak už se pustíme do výrazů.
Standardní proměnnéPři interpretaci skriptů awk dokáže rozeznat některé standardní proměnné, a nahradit je odpovídajícími hodnotami; v některých případech nám to může uspořit spoustu práce. Tak třeba už minule jsme se seznámili se standardní proměnnou NR, jež obsahuje číslo právě zpracovávané řádky. Samozřejmě bychom totéž mohli zajistit sami, např. takto:
{ line++; pole[line]=... }
ale NR je daleko pohodlnější, a nemůže dojít k problémům u složitějších skriptů: kdybychom třeba v minulém příkladu při nějakých úpravách zapomněli na původní účel a před složené závorky umístili nějaký omezující regulární výraz
/.gz/ { line++; ... }
skript by zřejmě přestal správně fungovat; s použitím standardního NR však takový problém nehrozí.
Mezi standardní proměnné patří
- FS ("Field Separator"): regulární výraz (!), který od sebe odděluje jednotlivá pole na řádku. Standardně je to mezera; obsah proměnné však můžeme podle potřeby změnit;
- RS ("Record Separator"): textový řetězec, který od sebe odděluje jednotlivé řádky. Standardně je zde samozřejmě znak LF ("\n"), ale i ten můžeme změnit;
- NF ("Number of Fields"): počet polí na řádku. Chceme-li např. vypsat vždy předposlední pole, můžeme použít příkaz print $(NF-1);
- NR ("Number of Records"): pořadové číslo řádku již známe.
Příkaz awk podporuje ještě další standardní proměnné, avšak ty se v praxi využívají méně často; kompletní seznam proměnných a jejich popis samozřejmě naleznete v man awk.
Výrazy
Výrazy můžeme sestavovat z proměnných (mezi něž počítáme i výrazy $N) a konstant pomocí standardních operátorů:
+ - * / % ^
Základní aritmetické operátory fungují víceméně standardním způsobem; programátoři v C si jen musí dát pozor na to, že awk nerozlišuje typy int a float, a proto dělení vždy počítá v reálných číslech; chceme-li získat celočíselný podíl, musíme použít standardní funkci int (funkce popíšeme příště). Operátor '^' representuje umocňování.
Naopak pro ty, kdo C neznají, připomínáme, že operátor '%' zjistí zbytek po celočíselném dělení.
+= -= *= /= %= ^= =
Kombinované operátory <op>= fungují přesně stejně jako v C: zápis "a<op>=b" přesně odpovídá zápisu "a=(a)<op>(b)", až na to, že "a" se vyhodnotí jen jednou (to má význam hlavně v případě, že vyhodnocení "a" má nějaké sideefekty).
Můžeme tedy standardně číst např. "x+=5" jako "přičti pětku k x".
Všechny operátory dosazení (včetně samotného '=') také stejně jako v C mají hodnotu ("to, co se dosadilo"), takže je můžeme spojovat dohromady a používat ve výrazech: tak třeba výraz "a=b+=c=3" můžeme rozdělit na "a=(b+=(c=3))", a číst jej takto:
- do proměnné "c" dosaď trojku...
- ...tuto hodnotu (3) přičti k proměnné "b"...
- výslednou hodnotu "b" dosaď do proměnné "a".
++ --
I operátory přičtení, respektive odečtení jedničky fungují stejně jako v C. Platí zde i to, že mohou být použity před nebo za proměnnou, a v prvém případě je hodnota výrazu hodnotou po provedení operace, kdežto ve druhém hodnotou před provedením operace:
157 /tmp> awk 'BEGIN { print i,j; print ++i,j++; print i,j }'
0 0
1 0
1 1
158 /tmp>
Speciálním operátorem awk, který jazyk C neznal, je mezera: ta spojí hodnoty po obou stranách jako řetězce:
163 /tmp> awk 'BEGIN { a="Ah"; b="oj"; c=a b ", Field separator je \"" FS "\""; print c }'
Ahoj, Field separator je " "
164 /tmp>
Můžeme využívat také relační operátory, jež vrací hodnotu 0 pro "není pravda" a 1 pro "je pravda", a můžeme je kombinovat pomocí operátorů pro logickou negaci, konjunkci a disjunkci:
> < >= <= == != ! && ||
Povšimněte si, že stejně jako v C pro zjištění rovnosti slouží dvojice znaků '='. To je past, do které často upadnou uživatelé jazyků jako BASIC nebo Pascal: použijeme-li omylem jen jediné rovnítko, bude se interpretovat jako dosazení, a můžeme se divit "nesmyslným" výsledkům!
Opět pro ty kdo neznají C, unární operátor '!' representuje negaci (podobně v kombinaci s rovnítkem slouží pro relaci "nerovná se"), a operátory '&&' a '||' representují konjuknci ("a zároveň"), respektive disjunkci ("nebo").
~ !~
Dvojice nových relačních operátorů srovná řetězec s regulárním výrazem, a vrátí hodnotu 1 ("ano") v případě, že řetězec regulárnímu výrazu odpovídá ('~') nebo neodpovídá ('!~'):
166 /tmp> ls -l | awk '{ print $9,$9~".gz" }'
...
IVarDealloc.sit 0
Kapitola4.tar.gz 1
Letterbox169.tiff 0
...
167 /tmp>
Uvnitř výrazů samozřejmě můžeme podle potřeby používat závorky.
Příště se podíváme na funkce
V příštím dílu našeho seriálu dokončíme popis výrazů awk popisem nejdůležitějších z jeho standardních funkcí.
Obsah seriálu (více o seriálu):
- Obcování s ďáblem
- Obcování s ďáblem 2 - základy
- Obcování s ďáblem 3 - Práce se soubory
- Obcování s ďáblem 4 - Další práce se soubory
- Obcování s ďáblem 5 - Stále soubory, hlavně linky
- Obcování s ďáblem 6: Pár zbývajících drobností
- Obcování s ďáblem 7: Samá voda, přihořívá, hoří!
- Obcování s ďáblem 8: Jak se do shellu volá, tak se program ozývá
- Obcování s ďáblem 9: Nové finty na programy
- Obcování s ďáblem 10: Do fronty, pánové, do fronty!
- Obcování s ďáblem 11: Standardní vstup a výstup
- Obcování s ďáblem 13: Další triky
- Obcování s ďáblem 14: Vyšší škola hledání souborů
- Obcování s ďáblem 15: Příkaz find stokrát jinak
- Obcování s ďáblem 16: Co se ještě dá uvařit z příkazu find
- Obcování s ďáblem 17: Regulární výrazy
- Obcování s ďáblem 18: Speciální regulární výrazy
- Obcování s ďáblem 19: Skládání regulárních výrazů
- Obcování s ďáblem 20: Regulární výrazy se zpětnými odkazy
- Obcování s ďáblem 21:K čemu je dobrý grep...
- Zázraky ihned, nemožné na počkání: sed
- Obcování s ďáblem - další finty s příkazem sed
- Rozsáhlejší příklad se sedem
- Obcování s ďáblem: Další kouzla, aneb awk
- Awk a proměnné
- Obcování s ďáblem 27: Awk a výrazy
- Obcování s ďáblem: Awk a funkce
- Awk a příkazy
- Co je to vlastně "uživatel"?
- Vlastnictví objektů
- Přístupová práva
- Vlastník, skupina, ostatní...
- Jak je to se skupinami?
- Skupiny a uživatelé
- Scripty
- Komentáře, a volba shellu
- Pro skript může být shell cokoli!
- Shellové skripty a argumenty
- Skripty a proměnné: aritmetika
- Proměnné shellu, "dědění" hodnot
- Práce s proměnnými
- Práce se jmény souborů
- Pole hodnot
- Další triky kolem polí...
- Standardní proměnné shellu
- Základní příkazy pro skripty
- Příkaz if
- Speciální podmínkové příkazy
- Podmínky pro práci se soubory
- Jednoduchý cyklus
- Příkaz for a pomocné příkazy break a continue
- Příkaz case
- Příkazy exit a select
- Rejstřík a přehled
- Procesy
- Informace o procesech
- Další klíčová slova pro příkaz ps
- Příkaz ps: několik praktických přepínačů
- A k čemu že je "ps" dobré?
- Copak procesor, s pamětí je to horší
- Virtuální paměť
- A ještě jednou virtuální paměť
- Zpět k příkazu ps
- Skutečný žrout paměti
- Ještě jednou top
- Doplněk k topu: vm_stat
- Co to tedy všechno znamená?
- Nevychází nám dal a má dáti?
- Kam se stránky ukládají?
- Změna odkládacího disku
- Změna odkládacího disku / fstab
- Poslední poznámka k fstab
- A jak to je se soubory?
- Co vlastně příkaz lsof vypisuje?
- Příkaz lsof a obsah sloupce NAME
- SIPS - Terminál není jen pro nadšence UNIXu
- Tak nám zabili NetInfo, paní Müllerová
Diskuse k článku