Úvod do UNIXu - cvičení


Cvičení se koná ve čtvrtek, 14:00 v SU2 na Malé Straně.

Podmínky k získání zápočtu

Zápočet získáte jedním z následujících způsobů:

Zkoušková písemka nanečisto

Na cvičení 6.5 se psala zkoušková písemka nanečisto. Její zadání (bez ústního komentáře).

Probraná látka

1. hodina

2. hodina

3. hodina

4. hodina

5. hodina

6. hodina

7. hodina

8. hodina

9. hodina

10. hodina

11. hodina

Na této hodině se psala zkoušková písemka nanečisto.

12. hodina

13. hodina

 

Domácí úkoly

Domácí úkoly, které se dají odevzdat mi prosím posílejte jako přílohy emailu. Úkoly, které nejde odevzdat, nebudu nijak kontrolovat, je ale ve vašem zájmu je splnit.

1. hodina

  1. Poslat mi email s vašim jménem (do předmětu napište třeba "Cvičení z unixu")
  2. Přihlásit se přes ssh na školní počítač (u-pl16.ms.mff.cuni.cz) a vyzkoušet si práci s vi.
  3. Napsat script, který vypíše počet souborů a adresářů v
    /usr/lib
    na standardní výstup a do souboru
    ~/pocet.txt
    (zkuste to jedním příkazem - vzpomeňte na
    tee
    .

2. hodina

Tento úkol má trvanlivost o dva týdny delší, protože jsem ho zadal pozdě :-) (tj. do 25. března)

  1. Napsat script, který provede databázový join nad vstup.txt a getent passwd tak, že spáruje uživatele podle uživatelského jména a výstup bude "<celé jméno> <druhý sloupec ve stup.txt>
    Testovací data: vstup.txt vystup.txt

3. hodina

  1. Připravit si dotazy na další cvičení (v případě, že něco nebylo jasné).
  2. Napsat script, který bere dva argumenty (po řadě vstupní a výstupní soubor, nemusíte ošetřovat chybějící/přebytečné argumenty - ale pozor, mohou v sobě mít mezery!). Ve vstupním souboru jsou uloženy emailové adresy různe roztroušené po textu. Úkol je vybrat právě ty platné emailové adresy a vypsat unikátně (tj. každá právě jednou - použijte sort). Pro zjednodušení předpokládejme, že emailová adresa se skládá z písmen, čísel, teček a podtržítek před a za zavináčem, s tím že poslední nejvyšší doména (třeba ".cz") musí obsahovat pouze písmena. Jednotlivé adresy jsou odděleny minimálně mezerou, čárkou nebo novým řádkem. Nemusíte zachovávat velikost písmen ani pořadí. Pokud máte dotazy, nebo si s tím už dlouho lámete hlavu, napište mi :-). (HINT: vystačíte si s tím, co jsme dělali na posledním cviku)
    Testovací data: vstup.txt vystup.txt

4. hodina

  1. Napište script na nahrazování v souboru. Po řadě parametry "covyhledat" "conahradit" "soubor". Asi budete chtít použít sed na replace - ale pozor! "conahradit" může obsahovat metaznaky (třeba lomítka atp.), takže bude potřebovat vhodně oescapovat - k tomu také použijete sed :-). "covyhledat" můžete předpokládat, že metaznaky neobsahuje, nebo jsou tam záměrně (abychom mohli vyhledávaný text napsat jako regulární výraz). Všechny 3 parametry mohou obsahovat mezery! Pokud budete mít problémy, včas se ozvěte (včas = nejpozději ve středu dopoledne). Příklad použití:
    ./nahrad "@TOC@" "Tady je hrozně dlouhý text, který může mít i nějaké metaznaky, jako třeba \\" soubor.txt

5. hodina

  1. Napište script ``seq''. Script přijme volitelně 1, 2, nebo 3 argumenty a vypíše sekvenci čísel od-do oddělenou mezerami. Syntaxe:
          seq LAST
          seq FIRST LAST
          seq FIRST INCREMENT LAST
    
    Kde v prvním případě se předpokládá FIRST=1. Pokud není zadán INCREMENT, předpokládá se INCREMENT=1. Pokud spustíte script bez argumentů, vypíše script nápovědu s použitím. Pamatujte, že podle normy není možno použít {..}, takže použijte standardní aritmetiku v shellu ( radši ``$(( ))'', kdo chce může ``expr'' )

6. hodina

Na této hodině nebyl zadán domácí úkol.

7. hodina

Na této hodině nebyl zadán domácí úkol.

8. hodina

  1. Napište hromadné rozesílátko emailů. Script dostane dva argumenty - soubor s emailem, co má rozeslat a soubor s adresátama (na každé řádce jeden). Soubor s emailem obsahuje na první řádce souboru předmět, zbytek je tělo emailu. Každý adresát dostane email právě jednou (i když je v seznamu vícekrát). Zkuste také ošetřit případ, kdy tělo emailu obsahuje text v kódování UTF-8 (mail vám ho nejspíše odmítne zpracovat). Použijte program ``mail'' :-).

9. hodina

(Tento úkol zadávám s předstihem, tj. je to úkol z hodiny co bude 22. dubna, ale ať na něj máte dost času :-)))

  1. Napište script, který bude generovat kostru fotogalerie. Co bude umět?
    • zmenšit obrázky na danou velikost (bude se zadávat jeden rozměr, druhý automaticky podle poměru dopočítat)
    • generovat náhledy zadané velikosti
    • rekurzivně prohledávat zdrojové adresáře
    • vyleze z něj soubor s náhledy a pro každý soubor s fotkou další s danou fotkou v plné velikosti a odkazy předešlý a další
    Html soubory nemusí být kompletní, stačí nějaký div s classou, kde to bude uloženo. Stránkování, ani zarovnání nemusíte řešit (zarovnání lze pořešit v css, stránkování nemám rád :-))
  2. Když budete manipulovat s obrázky, používejte programy ``convert''(1) a ``identify''(1) - nejsou standardní součástí unixu, nicméně jsou všude dostupné alespoň jako balíky :-)

10. hodina

  1. Mějte vstupní soubor:
    	30, 30, 30, 40
    	Honza 20, 10, 15, 30
    	Pepa 20, 30, 15, 20
    
    Kde na prvním řádku jsou napsány maximální počty bodů z testů a na každém dalším řádku první sloupec je jméno, každý další sloupec je počet bodů z testu, které student získal. Písemek může být libovolný počet a ten je stejný, jako na řádku s maximy možných bodů. Pokud student písemku nepsal, má z ní 0b. Napište program, který vypíše tabulku tvaru
    	Jméno <suma> <procenta> <známka>
    Kde student získá známky podle procentuálního počtu bodů všech testů, které psal:
    	90%+ ~ 1
    	70%+ ~ 2
    	50%+ ~ 3
    	<50% ~ 4
    

11. hodina

  1. Napište vlastní ``tar'' bez taru. Script by měl umět zapakovat adresářovou strukturu do jediného souboru a následně ji vybalit. Script by si měl pamatovat u každého souboru/adresáře jeho jméno, relativní cestu, přístupová práva, uživatele a skupinu. Script by měl zvládat mezery v názvech souborů a adresářů, textové i binární soubory. Použití:
    ./mytar -c /tmp/archiv.mt zdroj	         # zabalí adresář ``zdroj'' do archivu ``archiv.mt''
    ./mytar -x /tmp/archiv.mt .              # rozbalí archiv ``archiv.mt'' do adresáře ``.''
    		
  2. BONUSová část: Implementujte přepínače j (bzip2) a z (gzip) tak, aby manipulovaly s komprimovaným souborem (tj. navíc si před rozbalením nechali soubor dekomprimovat gzip/bzip2 a po zabalení soubor nechali zabalit). Bonusová část se počítá jako úkol navíc.

12. hodina

  1. Napište utilitu ``pv''. Je to utilita, které zadáte vstupní soubor, fifo (je speciální soubor), nebo nic (potom program čte ze standardního vstupu) a on přeposílá data na standardní výstup a na chybový výstup vykresluje přehledný progress bar, přenosovou rychlost, celková velikost dat v souboru (pouze pokud je vstup soubor - u fifa a std vstupu nelze zjistit) a odhadovaný čas dokončení.
  2. Pro přenos dat můžete použít třeba ``dd''.

13. hodina

Pro tento úkol platí termín odevzdání stejně jako pro ostatní - tj. čtvrtek 27., 14.00.

  1. Napište paralelní stahovací script. Script bude mít tři soubory: soubor linků na stažení, soubor linků, které se zrovna stahují a soubor linků, které už jsou stáhnuty. Script dostane na příkazové řádce první z nich (jména dalších si odvodí, případně použije na navazování, pokud existují !), počet procesů, které mají stahovat naráz a soubor, kam se mají ukládat stažené soubory. (nejlépe jako argumenty přepínačů s defaultními hodnotami)
  2. Dejte si pozor na zamykání souborů a korektní handlování chyb!
  3. Pro stahování použijte wget.

 

Doporučená literatura

Pokud jste něco nepochopili na přednášce, cvičení, nebo se chcete jenom zdokonalit, nabízím několik hodnotných odkazů, kam má cenu se podívat.

Další odkazy