V tejto časti seriálu o nástrojoch balíka GNU Coreutils sa zameriame na triedenie obsahu súboru, a tiež na štatistiky ohľadom počtu znakov, slov a riadkov v súbore. Keďže v linuxovom svete je všetko súbor, na praktickom príklade si ukáže, ako jednoznačne identifikovať konkrétny obsah konkrétneho súboru a výrazne tak znížiť riziko neoprávnenej zmeny obsahu súborov treťou stranou.
sort
Ako samotný názov nástroja napovedá, pôjde o triedenie. Konkrétnejšie podľa toho, či na začiatku riadku sú písmená, čísla alebo iné znaky. Prednastavené sú písmená, skúsme to teda najskôr s nimi:
printf 'raňajky\nobed\nvečera' | sort
Logicky správne poradie raňajky, obed, večera
bolo usporiadané podľa abecedy na obed, raňajky, večera
.
Pomocou prepínača -r
(ako reverse, čiže opačne) triedime od konca abecedy:
printf 'raňajky\nobed\nvečera' | sort -r
Prepínač -n
použijeme ak potrebujeme triediť čísla. Bez tohto prepínača by sa totiž čísla usporiadali takto:
printf '20\n2\n3' | sort
…no správne poradie vyzerá inak:
printf '20\n2\n3' | sort -n
Ak pred číslo pridáme znamienko plus (+) alebo mínus (-), musíme použiť prepínač -g
takto:
echo -e '-20\n2\n3' > cisla.txt
sort -g cisla.txt
V prípade verzií programu potrebujeme triedenie čísiel opäť upraviť, pretože prepínač -n
usporiada verzie nesprávne:
printf '1.10\n1.2' | sort -n
…na rozdiel od prepínača -V (veľké v):
printf '1.10\n1.2' | sort -V
Pomocou prepínača -o
(ako output, čiže výstup) zapíšeme zoradený text aj do súboru:
sort -g cisla.txt -o zoradene_cisla.txt
shuf
Názov nástroja shuf
je skratka od anglického slova shuffle, čiže zamiešať. V tomto prípade teda zoradíme riadky v náhodnom poradí najjednoduchšie takto:
echo -e '20\n2\n3\n5\n10' > cisla.txt
shuf cisla.txt
Pri každom novom spustení príkazu shuf cisla.txt
by malo byť poradie iné.
Vybrať si však môžeme iba istý počet riadkov, ktorý chceme vypísať. Prepínačom -n
tu napríklad zobrazíme iba jeden náhodne vybraný riadok:
shuf -n1 cisla.txt
Pri každom novom spustení príkazu shuf -n1 cisla.txt
by sa malo zobraziť iné číslo.
Podobne ako nástroj sort, aj shuf má prepínač -o
na uloženie výstupu do súboru:
shuf -n1 cisla.txt -o nahodny_riadok.txt
Vstup ale nemusí pochádzať iba zo súboru. Takto napríklad necháme vygenerovať jedno náhodné číslo (-n 1
), ktoré sa bude nachádzať v intervale 1 až 10 (-i 1-10
):
shuf -n 1 -i 1-10
uniq
Zatiaľ čo nástroje sort a shuf dávajú výstup kompletný, len upravia poradie, nástroj uniq
vyberie iba tie riadky, ktoré sa (ne)opakujú (uniq = jedinečný).
Ako duplikáty nástroj uniq rozoznáva iba tie položky, ktoré nasledujú za sebou. Keďže sú teda jablko a hruška oddelené položkou pomaranč, musíme všetky položky najskôr nechať zoradiť (sort) a až potom vybrať iba tie unikátne položky (uniq):
printf 'jablko\nhruška\npomaranč\njablko\nhruška' | sort | uniq
Ak naopak potrebujeme vypísať iba tie položky, ktoré sa opakujú, pridáme prepínač -d
(ako duplicate, čiže opakujúce sa) takto:
printf 'jablko\nhruška\npomaranč\njablko\nhruška' | sort | uniq -d
Pri použití prepínača -D
(veľké d) zobrazíme všetky duplikáty:
printf 'jablko\nhruška\npomaranč\njablko\nhruška' | sort | uniq -D
Počet opakovaní môžeme zapísať pred každý riadok prepínačom -c
takto:
printf 'jablko\nhruška\npomaranč\njablko\nhruška' | sort | uniq -c
No a niekedy potrebujeme, aby sa nebrali do úvahy veľké a malé písmená (prepínač -i
), takže Jablko bude to isté ako jablko:
printf 'Jablko\nhruška\npomaranč\njablko\nhruška' | sort | uniq -ic
Inak sa malé a veľké písmená rozoznávajú:
printf 'Jablko\nhruška\npomaranč\njablko\nhruška' | sort | uniq -c
Podobne ako pri nástrojoch sort a shuf, aj výstup nástroja uniq môžeme zaznamenať do súboru:
printf 'Jablko\nhruška\npomaranč\njablko\nhruška' | sort | uniq -ic > ovocie-pocty.txt
wc
Nástroj uniq dokáže spočítať počty výskytov opakovaní jednotlivých položiek. S nástrojom wc
(word count, čiže počet slov) však dokážeme spočítať aj znaky a slová, nie iba riadky:
printf 'Jablko a hruška\npomaranč\njablko a hruška\n' | wc
Výstup sú 3 čísla – v našom príklade 3 riadky (posledný prázdny sa nepočíta), 7 slov (znaky oddelené medzerou) a 44 bajtov v znakoch (špeciálne znaky ako š alebo č sa počítajú ako viacbajtové).
Keby sme špeciálne znaky š a č nahradili za s a c, počet bajtov v znakoch sa zníži na 41 takto:
printf 'Jablko a hruska\npomaranc\njablko a hruska\n' | wc
Ak však chceme každý znak počítať ako jednobajtový, použijeme prepínač -m
a dostaneme vždy rovnaký počet znakov pri všetkých znakoch:
printf 'Jablko a hruška\npomaranč\njablko a hruška\n' | wc -m
Vďaka prepínaču -l
(ako line, čiže riadok) vypíšeme iba počet riadkov a prepínač -w
(ako word, čiže slovo) zobrazí iba číslo určujúci počet slov:
printf 'Jablko a hruška\npomaranč\njablko a hruška\n' | wc -l
printf 'Jablko a hruška\npomaranč\njablko a hruška\n' | wc -w
Prepínače je možné kombinovať v ľubovoľnom poradí napríklad takto:
printf 'Jablko a hruška\npomaranč\njablko a hruška\n' | wc -lwm
Počet znakov riadku s najväčším počtom znakov vypíšeme pomocou prepínača -L
(veľké l) takto:
printf 'Jablko a hruška\npomaranč\njablko a hruška\n' | wc -L
Štatistiky nástroj wc zobrazí aj pre viacero súborov naraz (stačí ich názvy oddeliť medzerou), pričom výsledok môžeme zapísať do súboru s názvom statistiky.txt
takto:
wc cisla.txt ovocie.txt > statistiky.txt
sha256sum
Nástroj sha256sum
vypočíta kontrolný súčet (sum), ktorý je zabezpečený kryptografickým algoritmom SHA (Secure Hash Algorithm) s dĺžkou 256 bitov. Kontrolný súčet je niečo ako odtlačok prsta konkrétneho reťazca znakov či celého súboru. Takto ho vypočítame:
echo 'Toto je obsah súboru subor.txt' > subor.txt
sha256sum subor.txt
Vypísal sa nám textový reťazec, ktorý má vždy presne 64 znakov (kontrolný súčet). Nasledujú 2 medzery a názov súboru. Pomocou vytvoreného kontrolného súčtu sme jednoznačne identifikovali konkrétny súbor s konkrétnym obsahom. Keby sme obsah súboru zmenili, zmenil by sa aj kontrolný súčet:
echo 'Toto je zmenený obsah súboru subor.txt' > subor.txt
sha256sum subor.txt
Kontrolné súčty sa teda využívajú pri kontrole identity súborov. V praxi to znamená, že niektorí poskytovatelia softvéru zverejňujú na stiahnutie nielen samotné súbory, ale ku každému súboru priložia aj kontrolný súčet zabezpečený kryptografickým algoritmom ako je napríklad SHA-256. Takto si ktokoľvek môže ľahko overiť, či stiahol súbory, ktoré pochádzajú priamo od autora a že stiahnuté súbory neboli neoprávnene zmenené treťou stranou.
Ako ďalší príklad nech poslúži online služba virustotal.com, ktorá ponúka bezplatné skenovanie súborov na prítomnosť škodlivého kódu. Nemusíme ale nahrávať celý súbor, stačí iba jeho kontrolný súčet. Takto dokážeme rýchlo a jednoducho overiť bezpečnosť aj veľkého súboru (napríklad ISO obraz operačného systému Ubuntu Linux môže mať aj niekoľko gigabajtov).
Zhrnutie
V tejto časti seriálu o nástrojoch GNU Coreutils sme názorne prezentovali triedenie obsahu súborov, vypísali sme štatistiky obsahu súborov, a tiež sme demonštrovali, ako výrazne obmedziť priestor na neoprávnenú manipuláciu s obsahom súborov treťou stranou.