Linux: Kniha kouzel, vanilková příchuť 1.17 (27. února 2022)
Veškerá moc příkazové řádky/příkazového řádku přehledně, pro začátečníky i pokročilé

2. AWK

Řada 1.x vanilkové příchuti Linuxu: Knihy kouzel je od 1. října 2020 do 1. března 2023 ve stavu dlouhodobé pasivní údržby; nahlášené chyby budou opravovány, ale aktivní vývoj se již věnuje novější vývojové řadě určené pro novější verze operačního systému a programů. Pokud nejste vázáni na starší verze programů, doporučuji vyhledat novou verzi z aktivně vyvíjené vývojové řady.
program syntaxe zpracování textu

1. Úvod

AWK je skriptovací nástroj pro jednoduché řádkově orientované zpracování textových souborů. Jeho syntaxe vychází z bashe a jazyka C a navíc přidává literály regulárních výrazů v obyčejných lomítkách. Ve srovnání s jemu příbuzným Perlem je syntaxe AWK velmi umírněná a elegantní a jeho schopnosti omezené, což ho činí vhodným pro začátečníky, ale nedostačujícím pro rozsáhlé projekty nebo projekty vyžadující specializovanou funkcionalitu. GNU awk také není vhodné v situacích, kdy je nezbytný vysoký výkon a nízká spotřeba paměti.

Skript AWK se skládá ze sekvence takzvaných „vzorků“ (podmínek) a k nim příslušejících bloků příkazů. Jeho provádění si lze dobře představit, jako by šlo o sérii podmínek „if“ v cyklu „foreach“. AWK dělí vstupní soubory po řádcích (záznamech) a každý záznam rozdělí na sloupce a postupně testuje jeden vzorek po druhém. Když vzorek vyhoví, příslušný blok příkazů se vykoná, jinak se přeskočí. Navíc provádí AWK několik dalších, speciálních iterací, které vykonávají pouze bloky příkazů označené určitým klíčovým slovem (např. BEGIN).

Vzorek nebo blok příkazů je dovoleno vynechat; vynecháme-li vzorek, blok příkazů se vykoná pro každou řádku (ale ne ve speciálních iteracích); vynecháme-li blok příkazů, automaticky se doplní „{print $0}“.

Nejčastějším tvarem vzorku je podmínka tvořená pouze literálem regulárního výrazu (např. „/^a/“), taková podmínka se (nejen v tomto kontextu) automaticky rozšíří na výraz „($0 ~ /^a/)“, tedy porovnání načteného řádku s uvedeným regulárním výrazem.

Pozor! V AWK se řádky v souboru, indexy sloupců v záznamu, indexy čísly indexovaných polí i pozice znaků v řetězci počítají vždy od 1, nikdy od nuly!

2. Definice

3. Zaklínadla

3/1 Vzorky a bloky příkazů

podmíněné vykonávání (obecně)#1
podmínka [{blok příkazů}]
podmíněné vykonávání (příklady)#2
PROMENNA == 1 && /^X/ {ZAJIMAVY_RADEK = $0}
$1 ~ /ABC/ {print $2}
priznak {next}
$0 != "xyz" {print "ne-XYZ:";print $0;}
!/^#/
length($0) > 5 || /^%/ {print "Řádka " FNR " podmínku splnila."}
vykonat blok příkazů pro každou řádku#3
{blok příkazů}
před otevřením prvního souboru#4
BEGIN {blok příkazů}
před definitivním ukončením skriptu#5 (1)
END {blok příkazů}
po otevření souboru (ale před načtením prvního řádku)#6
BEGINFILE {blok příkazů}
po zpracování poslední řádky souboru#7 (2)
ENDFILE {blok příkazů}
řádky „od“ až „do“ včetně hranic#8
podmínka od,podmínka do [{blok příkazů}]
řádky „od“ až „do“ kromě hranic#9
{if (!pomocná_proměnná) {pomocná_proměnná = podmínka od} else if (podmínka do) {pomocná_proměnná = 0} else {blok příkazů}}

3/2 Skalární proměnné

přečíst hodnotu proměnné#1
název_proměnné
přiřadit hodnotu proměnné#2
název_proměnné = hodnota
získat hodnotu proměnné prostředí (obecně/příklad)#3
ENVIRON[řetězec-s-názvem-proměnné]
ENVIRON["PATH"]
přiřadit hodnotu proměnné prostředí#4
nepřímý přístup k proměnné (příklad)#5
PROMENNA = "hodnota";
UKAZATEL = "PROMENNA";
print SYMTAB[UKAZATEL];
SYMTAB[UKAZATEL] = "nova hodnota"

3/3 Asociativní pole

přečíst hodnotu prvku pole#1
pole[index]
přiřadit hodnotu prvku pole#2
pole[index] = hodnota
existuje prvek pole?#3
index in pole
smazat z pole jeden prvek/všechny prvky#4
delete pole[index];
delete pole;
počet prvků#5
length(pole)
zkopírovat celé pole#6
delete cílové_pole;
for (pomocná_proměnná in pole) {cílové_pole[pomocná_proměnná] = pole[pomocná_proměnná]}
je proměnná pole?#7 (3)
isarray(proměnná)

3/4 Asociativní pole: řazení

Poznámka k řazení asociativních polí: výsledkem řazení asociativního pole je vždy pole indexované celými čísly od 1 do návratové hodnoty řadicí funkce.

V následujících příkazech: „typ“ může být „num“ (řadit jako čísla) nebo „str“ (řadit jako řetězce, ale podle pozice znaků ve znakové sadě Unicode); „pořadí“ může být „asc“ (vzestupně) nebo „desc“ (sestupně).

seřadit hodnoty podle klíčů/podle hodnot/uživatelskou funkcí#1 (4)
asort(pole, cílové_pole, "@ind_typ_pořadí")
asort(pole, cílové_pole, "@val_typ_pořadí")
asort(pole, cílové_pole, "jméno_funkce")
seřadit klíče podle klíčů/podle hodnot/uživatelskou funkcí#2
asorti(pole, cílové_pole, "@ind_typ_pořadí")
asorti(pole, cílové_pole, "@val_typ_pořadí")
asorti(pole, cílové_pole, "jméno_funkce")
příklad řazení#3
pocet_jmen = asort(jmena, serazena_jmena, "@val_str_asc");

3/5 Podmínky, cykly a přepínač

podmínka if#1
if (podmínka) příkaz-nebo-blok [else příkaz-nebo-blok]
cyklus while#2
while (podmínka) příkaz-nebo-blok
cyklus for#3
for ([inicializace]; [podmínka]; [iterace]) příkaz-nebo-blok
cyklus foreach#4 (5)
for (proměnná in pole) příkaz-nebo-blok
přepínač switch#5 (6)
switch (skalární-výraz) {
[[case konstantní-hodnota:] [default:] příkazy]
}
cyklus do-while (alternativy)#6
do { příkazy } while (podmínka);
do příkaz; while (podmínka);

3/6 Řízení toku

opustit nejvnitřnější cyklus (for, while, do) nebo přepínač (switch)#1
break;
skočit na podmínku nejvnitřnějšího cyklu (for, while, do)#2
continue;
přejít na zpracování dalšího řádku#3
next;
přejít na zpracování dalšího souboru#4 (7)
nextfile;
přejít na průchod END („ukončit skript“)#5
exit [návratová-hodnota-programu];
vypsat chybovou zprávu a skončit s chybou#6
print chybová-zpráva-řetězec > "/dev/stderr"
exit 1;

3/7 Dělení záznamů na sloupce

dělit sloupce libovolnou sekvencí bílých znaků#1
FS = " ";
dělit sloupce tabulátorem#2
FS = "\t";
dělit sloupce regulárním výrazem#3
FS = "regulární výraz";
zapnout/vypnout režim sloupců pevné šířky#4
FIELDWIDTHS = "šířka-prvního-sloupce[ šířka-dalšího-sloupce]"
FIELDWIDTHS = ""
režim sloupců pevné šířky (příklad)#5
FIELDWIDTHS = "5 2 7"⊨ $1 = „12345“ $2 = „67“ $3 = „8901234“
vypnout dělení na sloupce#6
FS = RS;
každý znak jako samostatný sloupec#7
FS = "";
dělit sloupce výhradně mezerou#8
FS = "[ ]";
sloupce ze shod s regulárním výrazem (zapnout/vypnout)#9
FPAT = "neprázdný regulární výraz";
FPAT = "";

3/8 Speciální proměnné

načtená řádka (bez oddělovače záznamu/s oddělovačem záznamu)#1
$0
$0 RT
číslo řádky v souboru/celkově#2 (8)
FNR
NR
ʖsloupec načtené řádky (obecně/příklady...)#3
$číselný-výraz
$2
$12
$(NF - 1)
název/index právě načítaného souboru#4 (9)
FILENAME
ARGIND
počet sloupců v načteném řádku#5 (10)
NF
výstupní oddělovač sloupců/záznamů příkazu print#6 (11)
OFS = "[řetězec]"
۱vstupní oddělovač záznamu (jeden znak/regulární výraz)#7 (12)
RS = "znak"
RS = "regulární výraz"
hodnota posledního sloupce načteného řádku#8
$NF
počet souborů, které mají být (podle příkazové řádky) načteny jako vstupní#9 (13)
ARGC - 1
N-tý (od 1) vstupní soubor, jak je zadán na příkazovém řádku#10
ARGV[N]

3/9 Ostatní

komentář#1 (14)
#libovolný obsah až do konce řádky

4. Zaklínadla (výstup, vstup a interakce s bashem)

4/1 Příkazy výstupu

příkaz print#1 (15)
print výraz[, další-výraz] [přesměrování-výstupu];
funkce printf#2 (16)
printf(formátovací-řetězec[,výraz]) [přesměrování-výstupu];

4/2 Uzavření vstupu/výstupu

uzavřít soubor otevřený ke čtení či zápisu#1 (17)
close("řetězec/reprezentující/soubor")
uzavřít čtení výstupu příkazu#2
close("řetězec reprezentující příkaz")
uzavřít zápis na vstup příkazu#3
close("řetězec reprezentující příkaz")

4/3 Bash

vykonat příkaz interpretem „/bin/sh“ a vrátit jeho návratovou hodnotu#1
system(řetězec)

4/4 Přesměrování výstupu

Poznámky k přesměrování výstupu: Prvním zápisem do souboru, který ještě není otevřen, se tento soubor automaticky otevře pro zápis a zůstane otevřený pro další zápisy, dokud ho neuzavřete funkcí close() nebo do konce programu. Analogicky platí, že prvním zápisem na vstup dosud nespuštěného příkazu se tento příkaz spustí a další zápisy směřují na vstup téže instance příkazu, dokud spojení neuzavřete funkcí „close()“.

Pokud soubor existuje, při otevření se jeho obsah smaže; pokud chcete přidávat na konec souboru, použijte místo operátoru „>“ operátor „>>“ (princip je stejný jako v bashi).

výstup do souboru (příklad)(print/printf)#1
print "A:", A > "../seznam.txt";
printf("%s: %d\n", I, POLE[I]) > "hodnoty.txt";
poslat na (standardní) vstup jiného příkazu (print/printf)#2 (18)
print parametr[, další parametr] | "řetězec s příkazem" ;
printf(formátovací-řetězec[,parametr]) | "řetězec s příkazem" ;
zapsat na vstup jiného příkazu (příklad)#3
print I, S, "." | "sort -n";
zapsat na standardní chybový výstup#4
print parametry > "/dev/stderr";
printf(parametry) > "/dev/stderr";
zapsat do souboru jeden znak (přepsat/připojit)#5
printf("%s", "znak") > "řetězec/s/cestou/souboru")

4/5 Přesměrování vstupu

Poznámky k přesměrování vstupu: Prvním čtením ze souboru, který ještě není otevřen, se tento soubor automaticky otevře pro čtení a zůstané otevřený pro čtení dalších řádků, dokud ho neuzavřete funkcí close(). Analogicky platí, že čtení z příkazu, který ještě nebyl spuštěn, ho spustí a další čtení čtou z výstupu téže instance, dokud spojení neuzavřete funkcí „close()“.

přečíst řádku ze souboru#1
[if (]getline [PROMĚNNÁ] < "řetězec/s/cestou/souboru"[) tělo příkazu if]
Ȣpřečíst jeden znak ze souboru#2 (19)
RS = "(.)";
if (getline < "řetězec/s/cestou/souboru") {{proměnná} = RT}
˒přečíst celý soubor do zadané proměnné#3
normalni_RS = RS; RS = "^$"; PROMĚNNÁ = "";
getline PROMĚNNÁ < "řetězec/s/cestou/souboru";
RS = normalni_RS;
[close("řetězec/s/cestou/souboru");]
načíst řádku z výstupu příkazu#4
[if (]"příkaz" | getline [PROMĚNNÁ]) tělo příkazu if

4/6 Koprocesy

zapsat na standardní vstup koprocesu (alternativy)#1
příkaz print |& koproces;
přečíst řádek z výstupu koprocesu#2
[if (]koproces |& getline [PROMĚNNÁ][) tělo příkazu if]
uzavřít jen vstup koprocesu#3 (20)
close(koproces, "to");
vyčkat na ukončení koprocesu#4 (21)
close(koproces)

4/7 Informace o procesu AWK

PID procesu gawk/rodičovského procesu#1
PROCINFO["pid"]⊨ 7034
PROCINFO["ppid"]⊨ 4052
verze GNU awk#2
PROCINFO["version"]⊨ 4.1.4

5. Zaklínadla (funkce)

5/1 Uživatelské funkce

definovat funkci (volitelně s lokálními proměnnými)#1
function název funkce([první-parametr[,další-parametry]][,   lokální-proměnná[, další-lokální-proměnná]]) blok příkazů
volání funkce#2
název_funkce([parametr[, další parametr]])
nepřímé volání funkce#3
@proměnná([parametr[, další parametr]])

5/2 Řetězcové funkce (regulární výrazy)

Poznámka k řetězci náhrady: V tomto řetězci je nutno odzvláštnit znaky „\“ a „&“, protože mají speciální význam: Funkce sub(), gensub() a gsub() za neodzvláštněný znak „&“ dosadí text shody s nahrazovaným regulárním výrazem. Funkce „gensub()“ navíc za značky „\1“ až „\9“ (do řetězce nutno zadávat jako "\\1" atd.) dosadí text číslovaného záchytu (podřetězec odpovídající seskupení v regulárním výrazu).

vyhovuje/nevyhovuje regulárnímu výrazu?#1
řetězec ~ regulární-výraz
řetězec !~ regulární-výraz
nahradit první výskyt/N-tý výskyt/všechny výskyty regulárního výrazu v proměnné#2
sub(regulární výraz, řetězec-náhrady, proměnná)⊨ počet náhrad (0, nebo 1)
proměnná = gensub(regulární výraz, řetězec-náhrady, N, proměnná)⊨ řetězec po náhradě (nezměněný, pokud k náhradě nedošlo)
gsub(regulární výraz, řetězec-náhrady, proměnná)⊨ počet náhrad
nahradit první výskyt/N-tý výskyt/všechny shody v $0#3
sub(regulární výraz, řetězec-náhrady)⊨ počet náhrad (0, nebo 1)
$0 = gensub(regulární výraz, řetězec-náhrady, N)⊨ řetězec po náhradě (nezměněný, pokud k náhradě nedošlo)
gsub(regulární výraz, řetězec-náhrady)⊨ počet náhrad
nahradit první výskyt/N-tý výskyt/všechny výskyty regulárního výrazu v řetězci#4
gensub(regulární výraz, řetězec-náhrady, 1, řetězec)
gensub(regulární výraz, řetězec-náhrady, N, řetězec)
gensub(regulární výraz, řetězec-náhrady, "g", řetězec)
najít a vypsat první shodu s regulárním výrazem#5 (22)
if (match(řetězec, regulární-výraz)) {
print substr(řetězec, RSTART, RLENGTH);
}
najít všechny shody s regulárním výrazem a sestavit z nich číslované pole#6 (23)
patsplit(řetězec, pole, regulární-výraz [,pole-pro-oddělovače])⊨ počet shod (např. „3“)
rozdělit řetězec do pole, oddělovač je definovaný regulárním výrazem#7
split(řetězec, pole, regulární-výraz[,pole_pro_oddělovače])
příklad: v řetězci „a=15:b=79“ v proměnné „x“ vyměnit čísla#8
x = gensub(/^a=([0-9]+):b=([0-9]+)$/, "a=\\2:b=\\1", 1, x);⊨ a=79:b=15

5/3 Řetězcové funkce (základní)

spojit dva řetězce (konkatenace)#1
jeden-řetězec druhý-řetězec
získat podřetězec podle pozice#2
substr(řetězec, počáteční-pozice[, maximální-délka])
najít pozici prvního výskytu podřetězce#3 (24)
index(řetězec, hledaný-podřetězec)
zjistit délku řetězce#4
length(řetězec)
rozdělit řetězec do pole (podle FS/určitým znakem)#5
split(řetězec, pole)
split(řetězec, pole, "znak"[,pole_pro_oddělovače])
naformátovat řetězec (funkce sprintf známá z jazyka C)#6
sprintf(formátovací-řetězec[, parametr])
převod na malá písmena/velká písmena#7 (25)
tolower(řetězec)
toupper(řetězec)
˓sekvence více výskytů téhož znaku v řetězci nahradit jeho jedním výskytem#8

5/4 Konverze číselných soustav

desítkové číslo na hexadecimální/hexadecimální na desítkové#1
sprintf("[0x]%x", číslo)
strtonum("0xhex-číslo)
desítkové číslo na osmičkové/osmičkové na desítkové#2
sprintf("[0]%o", číslo)
strtonum("0osmičkové-číslo)

5/5 Číselné funkce

absolutní hodnota#1
x >= 0 ? x : -x
zaokrouhlit desetinné číslo na nejbližší celé číslo/k nule/jen oříznout desetinnou část#2
číslo >= 0 ? int(číslo + 0.4999999) : int(číslo - 0.4999999)
číslo >= 0 ? int(číslo) : -int(-číslo)
int(hodnota)
vygenerovat pseudonáhodné celé číslo 0 <= y < maximum#3 (26)
int(rand() * maximum)
vygenerovat pseudonáhodné celé číslo 0 <= y < 4 294 967 296#4
65356 * int(65536 * rand()) + int(65536 * rand())
nastavit počáteční „semínko“ generátoru pseudonáhodných čísel (na hodnotu/podle času)#5
srand(hodnota-semínka)
srand()
vygenerovat pseudonáhodné desetinné číslo 0 <= y < 1#6
rand()
druhá odmocnina/druhá mocnina#7
sqrt(x)
x^2
arcus tangens y / x#8
atan2(y, x)
sinus/kosinus/tangens/contangens#9
sin(x)
cos(x)
sin(x) / cos(x)
cos(x) / sin(x)
přirozený logaritmus / e na x-tou#10
log(x)
exp(x)

5/6 Práce s časem

aktuální čas (jako časová známka Unixu)#1
systime()
zformátovat čas#2 (27)
strftime(formát,časová-známka-Unixu[, 1])

5/7 Pokročilé konstrukce

načíst jiný zdrojový soubor, jako by jeho obsah byl zapsán zde#1
@include "cesta/k/souboru.awk"
implementovat načítání řádek rozdělených znakem \ před znakem konce řádku (tento kód vložit na začátek skriptu)#2
proměnná != "" {$0 = proměnná; proměnná = "";}
/(^|[^\\])(\\\\)*\\$/ {proměnná = substr($0, 1, length($0) - 1); next;}

6. Parametry příkazů

gawk parametry-gawk [[--] vstupní-soubory]
gawk parametry-gawk [[--] parametry-skriptu]
gawk parametry-kromě-e-f-i program [[--] vstupní-soubory]
gawk --version
-F hodnotaPřednastaví hodnotu proměnné FS (vstupního oddělovače sloupců).
-v proměnná=hodnotaPřednastaví hodnotu určité proměnné.
-f souborNačte kód ke spuštění z daného souboru.
-e kódVezme uvedený kód ke spuštění.
-bVstup a výstup realizuje po bajtech, ne v UTF-8.
--profile=souborShromáždí „profilovací“ data a po skončení programu je zapíše do uvedeného souboru. (Nezkoušeno.)
--sandboxVypne všechny funkce, které by mohl skript použít k přístupu k jiným souborům než těm, které mu byly předány na příkazovém řádku; to zahrnuje např. funkci „system()“, přesměrování výstupů apod.

Poznámka: Parametry -f a -e můžete kombinovat a zadávat opakovaně. Každý další takový parametr přidá takový kód k již načtenému, takže se nakonec všechny spojí do jednoho programu.

7. Instalace na Ubuntu

sudo apt-get install gawk

8. Tipy a zkušenosti

9. Další zdroje informací

10. Pomocné funkce a skripty

lkk retence – načte celý standardní vstup do paměti a po uzavření vstupu jej vypíše na výstup#1
#!/bin/bash
exec gawk -b -e 'BEGIN {RS = FS = "^$"; ORS = "";} {print}'
1 Pozor: zvláštní průchod END se vykoná i tehdy, je-li skript ukončován příkazem „exit“!
2 Pozor: zvláštní průchod ENDFILE se nevykoná, pokud je zpracování souboru předčasně ukončeno, např. příkazem „nextfile“ či „exit“.
3 Tato funkce je nejužitečnější u parametrů funkcí; díky ní může funkce ověřit, že jí v určitém parametru bylo předáno pole, nebo naopak skalární hodnota.
4 Při řazení uživatelskou funkcí musíte zadat funkci, která přijme parametry „klíč-L“, „hodnota-L“, „klíč-R“ a „hodnota-R“ v tomto pořadí a vrátí záporné číslo, je-li L-strana menší než R-strana; kladné číslo, je-li větší; a nulu, jsou-li si obě strany rovny.
5 Poznámka: cyklus přiřazuje proměnné hodnoty INDEXŮ daného pole v LIBOVOLNÉM pořadí! Pro přístup k hodnotám v poli je musíte indexovat.
6 Přepínač switch pracuje v gawk stejně jako v jazyce C, ovšem pracuje s řetězci místo celých čísel.
7 Poznámka: tento příkaz přeskočí odpovídající průchod ENDFILE!
8 Do obou uvedených proměnných můžete také přiřadit novou hodnotu, a změnit tak číslování řádku pro zbytek souboru (resp. veškerého vstupu)
9 Nelze použít v blocích BEGIN a END.
10 Počet sloupců lze i nastavit.
11 Výchozí hodnota je „ “ (mezera); může být přednastaven také parametrem příkazové řádky „-F“.
12 Výchozí hodnotou je konec řádku „\n“.
13 Poznámka: vrací-li 0, stejně má být čten standardní vstup.
14 Znak # není interpretován jako začátek komentáře uvnitř řetězců ani literálů regulárních výrazů.
15 Příkaz print zapíše na výstup svoje parametry, oddělené obsahem proměnné „OFS“ (výchozí hodnotou je " "), a za poslední parametr přidá navíc hodnotu proměnné „ORS“ (výchozí hodnota je "\n").
16 Funkce printf() funguje stejně jako v jazyce C, až na to, že parametr %c dokáže vypisovat UTF-8 znaky v rozsahu 0 až cca 55000 (ale např. místo znaku č. 55339 vypíše „+“).
17 Tato varianta funkce „close()“ vrací 0 v případě úspěchu, jiná hodnota značí chybu.
18 Odkazovaný příkaz se spustí v interpretu /bin/sh a svoje vstupy a výstupy zdědí od instance GNU awk, kterou byl spuštěn, pokud je výslovně nepřesměrujete.
19 Poznámka: po použití této konstrukce pravděpodobně budete muset obnovit hodnoty proměnných RS, $0, RT, NR a FNR.
20 Po uzavření vstupu koprocesu můžete pouze číst z jeho výstupu. Pokus o další zápis před úplným ukončením koprocesu je fatální chyba.
21 Funkce close() v tomto případě vrátí návratovou hodnotu koprocesu vynásobenou 256.
22 Nebyla-li shoda s regulárním výrazem nalezena, funkce match() vrací 0; jinak nastaví proměnné RSTART a RLENGTH na pozici a délku nalezeného podřetězce a vrátí hodnotu RSTART. Vždy vybírá nejlevější a nejdelší shodu.
23 Funkce „patsplit()“ vyhledá všechny shody řetězce s regulárním výrazem a vrátí jejich počet (N). Předané pole pak smaže a naplní těmito shodami. Zadáte-li i pole pro oddělovače, pak ho tato funkce vyplní podřetězci, které zbyly mezi jednotlivými shodami, přičemž řetězec před první shodou bude umístěn na indexu 0 a řetězec za poslední shodou na indexu N.
24 Vrátí 0, nebyl-li podřetězec nalezen; jinak vrátí pozici podřetězce (číslovanou od 1).
25 V gawk tyto funkce rozpoznávají znaky národní abecedy (pravděpodobně podle „locale“), v mawk účinkují pouze na ASCII znaky.
26 Vhodné jen pro maxima do 16 777 215. Pro vyšší maximum bude množina vrácených hodnot pravidelně přerušovaná, což pro některé druhy využití nemusí vadit. Správným řešením je bitová kombinace více volání funkce „rand()“.
27 Bez parametru „1“ vypíše lokální čas, s ním vypíše UTC. Pro „formát“ – viz kapitolu „Datum, čas a kalendář“.
DockerSystémMarkdown