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: Awk a funkce
14. února 2002, 00.00 | Dnes se seznámíme s nejdůležitějšími ze standardních funkcí, jež awk nabízí.
Dnes se seznámíme s nejdůležitějšími ze standardních funkcí, jež awk nabízí.
Aritmetika a podobně
Pro práci s čísly jsou k dispozici (mj.) tyto služby:
- exp(x): zjistí hodnotu e^x;
- log(x): zjistí přirozený logaritmus čísla x;
- sqrt(x): nalezne druhou odmocninu čísla x;
- sin(x): zjistí sinus x;
- cos(x): nalezne cosinus x;
- atan2(y,x): zjistí hodnotu arkustangentu y/x (tato podoba je nejvhodnější pro převody kartézských souřadnic na polární, proto je preferována před prostým arkustangentem);
- int(x): vrátí celočíselnou část čísla x;
- rand: vrátí náhodnou hodnotu mezi nulou a jedničkou.
Funkce pro práci s textem
Služby awk pro práci s textovými řetězci se využívají v praxi mnohem častěji, než aritmetické funkce — konečně, awk většinou slouží právě na zpracování textu. Proto se na ně podíváme trochu podrobněji, a ukážeme si i několik příkladů.
Vyhledávání částečných řetězců
Pro jednoduchou práci s částečnými řetězci slouží funkce index a substr. První z nich vyhledá pozici zadaného řetězce; druhá naopak vrátí částečný řetězec, určený pozicí a délkou. Pozor; na rozdíl od obdobných služeb knihoven jazyka C jsou zde indexy počítány od jedné, ne od nuly:
- index(text,řetězec): vyhledá řetězec v textu a vrátí pozici jeho začátku. Jestliže v textu není řetězec obsažen, vrátí nulu;
- substr(text,pozice,délka): vrátí částečný řetězec, který leží v textu na pozici a má délka znaků.
Typické využití by mohlo vypadat třeba nějak takto:
192 /tmp> ls -l
total 3008
-rw-r--r-- 1 ocs wheel 116880 Jan 23 17:57 BadAspectRatio.tiff
drwxr-xr-x 2 ocs wheel 24 Jan 19 03:15 Format.rtfd/
drwxr-xr-x 15 ocs wheel 466 Jan 23 22:59 IVarDealloc/
-rw-r--r-- 1 100 staff 427227 Jan 23 22:17 IVarDealloc.sit
...
193 /tmp> ls -l | awk '{ print $9,"prava vlastnika:",substr($1,2,3) }'
BadAspectRatio.tiff prava vlastnika: rw-
Format.rtfd/ prava vlastnika: rwx
IVarDealloc/ prava vlastnika: rwx
IVarDealloc.sit prava vlastnika: rw-
...
194 /tmp>
Mezi funkce pro práci s částečnými řetězci můžeme zařadit i funkci length, která zjistí délku zadaného řetězce:
- length[(řetězec)]: argument je nepovinný; pokud jej vynecháme, vrátí funkce délku celého zpracovávaného řádku (takže length je totéž, jako length($0)).
Regulární výrazy
Ve složitějších případech ovšem jednoduché služby pro práci s částečnými řetězci podle indexů nestačí. V awk ovšem máme k dispozici služby, jež využívají regulárních výrazů:
- match(text,regexp): vrátí index prvního výskytu částečného řetězce, odpovídajícího regulárnímu výrazu regexp uvnitř textu. Jestliže žádná část textu regulárnímu výrazu neodpovídá, vrátí nulu. Pro větší pohodlí programátora jako sideefekt uloží vrácenou hodnotu (index) do proměnné RSTART a délku částečného řetězce do proměnné RLENGTH;
- sub(regexp,řetězec[,text]): vyhledá první výskyt částečného řetězce, odpovídajícího regulárnímu výrazu regexp uvnitř textu, a nahradí jej řetězcem. Argument text můžeme vynechat; pak se na jeho místě automaticky použije právě zpracovávaný řádek (tedy $0). Existuje varianta této funkce gsub, jež pracuje obdobně, ale namísto prvého výskytu nahradí všechny výskyty regulárního výrazu;
- split(text,pole[,regexp]): rozdělí text na části, oddělené výskyty regulárního výrazu regexp. Ty uloží do pole pole (počínaje indexem 1), a vrátí jejich počet. Argument regexp můžeme vynechat; pak se na jeho místě automaticky použije obsah standardní proměnné FS.
Dejme tomu, že bychom chtěli ve jménech souborů vyhledávat části, jež začínají písmenem 'a' a končí písmenem 't':
199 /tmp> ls -l | awk '{ match($9,"a.*t"); print $9,substr($9,RSTART,RLENGTH) }'
BadAspectRatio.tiff adAspectRatio.t
Format.rtfd/ at.rt
IVarDealloc/
IVarDealloc.sit arDealloc.sit
...
200 /tmp>
Převody
Potřebujeme-li vzájemně převádět malá a velká písmena, můžeme použít funkce tolower a toupper:
- tolower(text): vrátí tentýž text, avšak převede všechna velká písmena na malá;
- toupper(text): vrátí tentýž text, avšak převede všechna malá písmena na velká.
Speciální funkce
Ačkoli awk podporuje více speciálních funkcí, my se seznámíme jen s jednou z nich:
- cmd(příkaz): provede zadaný příkaz v shellu.
Následujícím způsobem např. můžeme uložit do archivu všechny obrázky, jejichž velikost nepřesahuje 100 000 bytů (používáme dosud nepopsaný příkaz if, ovšem jeho význam je zřejmý):
241 /tmp> ls -l *.tiff
-rw-r--r-- 1 ocs wheel 116880 Jan 23 17:57 BadAspectRatio.tiff
-rw-r--r-- 1 ocs wheel 50114 Jan 23 18:26 Letterbox169.tiff
-rw-r--r-- 1 ocs wheel 29518 Jan 23 17:19 PixelWidth.tiff
242 /tmp> ls -l *.tiff | awk '{ if ($5<100000) f=f " " $9 } END { system("tar czf SmallTiffs.tar.Z" f) }'
243 /tmp> tar tzf SmallTiffs.tar.Z
Letterbox169.tiff
PixelWidth.tiff
244 /tmp>
Příště...
...se jen na malou chvilku vrátíme k výběru řádků, a pak se konečně pustíme do příkazů. Popíšeme si tedy mj. i příkaz if, který jsme zatím použíli jen intuitivně.
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á