Programování v unixovém shellu – úkoly

Seminář 1


Úkoly z cvičení 2 až 5 v předmětu Unixové systémy.

Seminář 2


Úkoly z cvičení 6 až 10 v předmětu Unixové systémy.

Seminář 3


Úkol 1:
Vypište seznam všech souborů a podadresářů v adresáři (= obsah adresáře) zadaném jako argument s informacemi o typu (- = soubor, d = adresář, l = symbolický odkaz) a právech (r = čtení, w = zápis, x = spouštění) pro spouštějícího uživatele, ve tvaru: jméno typ práva, např. pokus d rwx. Při žádném argumentu v aktuálním adresáři, při prvním argumentu -a (adresář by byl druhý argument) včetně tzv. skrytých souborů a podadresářů (jinak ne). Řešte bez použití programů ls a dir!
[2 body]

Úkol 2:
Naprogramujte hádání (celého) čísla, které si uživatel myslí, z intervalu zadaného až dvěma argumenty, sérií (pouze!) dotazů je menší/větší než X? s odpověďmi a/n algoritmem půlení intervalu. Při jednom argumentu je levá mez intervalu 0, při žádném navíc pravá 100.
[2 body]

Úkol 3:
Implementujte zjednodušenou verzi programu seq: výpis posloupnosti (celých) čísel oddělených mezerou od čísla zadaného jako první argument do čísla zadaného jako třetí argument, obojí včetně, s přírůstkem zadaným jako druhý argument – kladným, pokud je počáteční číslo menší nebo rovno než koncové, jinak záporným. Při dvou argumentech je chybějící přírůstek roven 1, při jednom je i chybějící počáteční číslo rovno 1.
[4 body]

Seminář 4


Úkol 4:
Napište funkce vracející (vypisující)

  1. číslo zadané jako argument v poziční číselné soustavě o základu 2 až 64 (cifry jsou 0-9, a-z, A-Z, @ a _) v desítkové soustavě,
  2. zápis čísla zadaného jako argument v desítkové soustavě v soustavě o základu 2 až 64 (...).
Základ soustavy je zadaný jako druhý argument, při chybějícím 2.
[3 body]

Úkol 5:
Implementujte jako funkce (zjednodušené) programy dirname a basename: z cesty zadané jako argument, po odebrání případného / na konci, vrátí (vypíše) část do (dirname), resp. od (basename) posledního / (bez něj, pokud to není jediný znak). Pokud cesta / neobsahuje, dirname vrátí . (tečku) a basename celé jméno.
[2+2 body]

Seminář 5


Úkol 6:
Vygenerujte 1000 souborů z následujícího úkolu s pořadovými čísly 0001 až 1000 a náhodným datem (ne nutně reálným, MM od 01 do 12, DD od 01 do 31, YYYY od 0001 do 9999), do adresáře zadaného jako argument.
[2 body]

Úkol 7:
Uvažujme adresář obsahující soubory XYZNNNN.jpg, kde XYZ je nějaká předpona a NNNN je pořadové číslo od 0000 do 9999. V každém souboru je textově zapsané datum ve tvaru MM/DD/YYYY zleva zarovnané 0 (ve skutečnosti by z validních souborů fotek ve formátu JPEG bylo možné získat datum a čas pořízení fotky z EXIF informací v souboru). Například adresář v
ZIP archivu, pro rozbalení spusťte unzip fotky.zip. Vytvořte skript s tímto adresářem jako argumentem, který přesune soubory do podadresářů adresáře s cestami ve tvaru YYYY/MM/DD. Každý podadresář bude existovat jen pokud v něm bude alespoň jeden soubor.
[5 bodů]

Seminář 6


Úkol 8:
Vytvořte sed skript, který z textu vyfiltruje jen řádky od 10. řádku do 20. řádku včetně (počítáno od 1) v opačném pořadí řádků.
[4 body]

Úkol 9:
Vytvořte sed skript, který sloučí sousední řádky textu končící znakem -, pokud před ním nejsou bílé znaky (mezera, tabulátor), spolu s následujícím řádkem (již bez znaku - na konci) do jednoho řádku, s odstraněním znaků -.
[5 bodů]

Seminář 7


Úkol 10:
Vytvořte skript (shell, sed), který pro každý řádek na vstupu ve tvaru 'Jméno Příjmení <emailová@adresa>' (bez '', položky oddělené mezerami) vytvoří kopii textového souboru, šablony zadané jako argument skriptu, ve kterém budou všechny řetězce JMENO a PRIJMENI nahrazeny Jménem a Příjmením ze vstupu a před obsahem bude na prvním řádku <emailová@adresa> následovaná prázdným řádkem. Kopie budou pojmenovány jako šablona s uvedením čísla řádku ze vstupu ve jménu.
[3 body]

Úkol 11:
Vytvořte skript (shell, sed), který z HTML dokumentu na vstupu vypíše pouze URL adresy všech odkazů, přesněji hodnoty atributu HREF všech elementů A v dokumentu. Nezapomeňte korektně ošetřit i případy, kdy za jménem elementu A mohou být i jiné atributy než HREF a kdekoliv mezi A a HREF může být element (i vícekrát) zalomen na další řádek! Samotné URL adresy zalomeny nebudou.
[4 body]

Seminář 8


Úkol 12:
Implementujte v awk zjednodušenou verzi wc: výpis počtu znaků (včetně konců řádků), slov (neprázdná posloupnost znaků oddělená mezerami nebo tabulátory) a řádků v textu na vstupu.
[3 body]

Úkol 13:
Implementujte v awk převrácení tabulkových dat (sloupce oddělené mezerami nebo tabulátory) ze vstupu podle hlavní diagonály, tj. výměnu řádků a sloupců.
[3 body]

Seminář 9


Úkol 14:
Vytvořte skript (shell, sed, awk aj.), který pro každého uživatele, který má aktuálně v systému spuštěný alespoň jeden proces, vypíše celkové množství paměti zabrané všemi těmito jeho aktuálně v systému spuštěnými procesy. Jako množství paměti zabrané procesem použijte hodnotu rss vypisovanou pro procesy programem ps.
[3 body]

Úkol 15:
Vytvořte skript (shell, sed, awk aj.), který pro počet dní zadaný jako argument a každého uživatele, který byl nebo aktuálně stále je v systému přihlášen za posledních zadaný počet dní, vypíše celkovou dobu přihlášení (sezení) uživatele v systému. Jako dobu jednoho přihlášení (sezení) uživatele v systému použijte hodnotu vypisovanou v posledním sloupci, pro uživatele v prvním sloupci, programem last spustěným s argumentem pts/{0..9}. Tato hodnota má tvar (počet dní+hodin:minut), kde část počet dní+ nemusí být uvedena, nebo je to still logged in v případě, že uživatel je aktuálně stále v systému přihlášen – v tomto případě je v předposledním sloupci vypsaný čas přihlášení uživatele. Celkovou dobu vypište ve stejném tvaru.
[6 bodů]

Seminář 10


Úkol 16:
Pro seznam jmen ve tvaru Jméno Jméno ... tabulátor PŘÍJMENÍ PŘÍJMENÍ ... (Jména a PŘÍJMENÍ oddělená mezerou), např. ze
souboru, v souboru zadaném jako argument nebo načtený ze vstupu, vypište ke každému Jménu v seznamu, v abecedním pořadí Jmen, počet jmen s tímto Jménem.
[3 body]

Úkol 17:
V seznamu jmen z předchozího úkolu (opět v souboru zadaném jako argument nebo načteném ze vstupu) přepište všechna PŘÍJMENÍ na Příjmení.
[4 body]