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ů:
- splněním 2/3 domácích úkolů (budou zadávány na cvičení a uvedeny zde na webu) - vždy do dalšího týdne, NEBO (kolik má kdo testů můžete zjistit na stránce úkoly)
- vypracováním netriviálního zápočtového programu v shellu, rozsahu asi 3-krát většího než zkoušková písemka - pro více informací mi napište email nebo se zeptejte na hodině
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
- Seznámení s prostředím, shell
- Základní příkazy - cd, mv, mkdir, ls, cat, head, tail, rev, wc
- Základy editoru vi
- Úlohy ze cvičení
- Vytvořit adresáře a/b/c a a/bb v domovském adresáři.
- Vypsat pracovní adresář.
- Přejmenovat a/bb na a/cc.
- Úlohu (1) pouze jedním příkazem.
- Spočítat počet adresářů a souborů v
/
.
- Vypsat prvních 10 řádků ze souboru
/etc/passwd
- Vypsat posledních 10 řádků ze souboru
/etc/passwd
- Vypsat 10-20 řádek ze souboru
/etc/passwd
- Vyzkoušet úlohy (6-7) s 15-ti řádky, v (8) vypsat 11.-22. řádek.
- Vytvořit soubor hello.txt v obsahem "Ahoj světe".
- Napsat script, který vypíše "Hello world!" (pomocí příkazu
echo
).
- Spočítat počet znaků v scriptu z minulé úlohy (s catem a dva způsoby bez catu).
- Vyzkoušet si příkazy
tac
, rev
.
- Vyzkoušet si v editoru vi příkazy
dd
, yy
,
x
, p
,
P
a varianty, kdy nejdřív napíšete číslo (tj. 15dd) - pozor, musíte být v příkazovém řežimu a čísla ani znaky se nikam nevypisují (tj. píšete naslepo).
- Během plnění úkolů si zkusit
man
.
2. hodina
- Oprávnění, výpis a změny.
- Uživatelé a skupiny.
- Hledání souborů - find
- Standardní vstup, výstup a chybový výstup.
- Práce s textem - cut, sort, join.
- Úlohy ze cvičení (trošku pozměněné).
- Zjistit oprávnění k
/etc/passwd
- Vytvořit soubor s právy 0777, změnit na 0766. Vyzkošet si číst ze souboru s právy 0000.
- Vypište všechny soubory a adresáře v
/etc
obsahující "conf"
- Vypište všechny adresáře v
/lib
.
- Vypište všechny soubory v
/lib
končící na ".so"
- Spočítejte soubory v
/usr/lib
končící na ".so".
- Spočítejte všechny soubory a adresáře v
/proc
.
- Zbavte se chyb v minulém příkladu.
- Spočítejte chybové hlášky z předminulého příkladu. (napište jako script, použijte pomocný soubor - nezapomentě ho po sobě ale smazat!)
- Vypište čísla uživatelů v
/etc/passwd
.
- Vypište seznam uživatelů získaných pomocí
getent passwd
a setřiďte podle jména.
- Jako předchozí úloha, ale setřiďte podle uživatelského id.
- Získejte uživatelská jména a id (pouze!) pomocí
getent passwd
a setřiďte podle id.
- Vypište celá jména uživatelů a setřiďte podle příjmení.
3. hodina
- Úprava textu - tr, základy substituce v sedu
- Základy regulárních výrazů - sed, grep
- Proměnné prostředí, evaluace, "matematická" evaluace - $XX, $( ), $(( )), ` `
-
Úlohy ze cvičení.
- Vypište všechny soubory ve svém domovském adresáři malými písmeny.
- Vypište všechny soubory v /usr/lib tak, aby neobsahovaly samohlásky.
- Vyzkoušejte příkazy stat a file na nějakých shellových scriptech, knihovnách
.so v /usr/lib a binárkách v /usr/bin
- Vypište dvojce "uživatel - uid" z getent passwd (všimněte si, že je tam
pomlčka)
- Vypište všechny soubory (v /usr/lib), které končí na ".so..", kde
je jedno až dvouciferné číslo. (pouzijte grep)
- Zkopírujte všechny soubory ve vašem domovském adresáři do adresáře
/tmp/zaloha-uzivatel-datum, kde uzivatel je vaše uživatelské jméno a datum
je dnešní datum (použijte proměnné a substituci)
- Vylepšete předchozí příklad tak, aby mohl sloužit jako zálohovací script.
- Upravte zálohavcí script tak, aby bylo možné zálohovat vícekrát za den (první
záloha normální, druhá záloha bude mít za název připojena ".1", třetí ".2"
atd.
- Bonus - zkuste vytvořit komprimovaný archiv (hint: použijte tar)
- Bonus - umožněte přidat parametr, kam se má záloha uložit
- Bonus - umožněte přidat parametr, že se má přepsat již existující záloha,
pokud existuje (a nepřipojovat ".x")
- Upravte náš zálohovací script tak, aby dobře handloval chybové stavy (tj.
vypsal chybovou hlášku na stderr a sám vrátil chybový stav)
- BONUS: Zjistit, jestli v getent passwd ma nekdo 3 jmena (prave 3 a alespon 3).
4. hodina
- Procvičování regulárních výrazů
- Pokračovali jsme v úlohách ze 3. hodiny.
5. hodina
- Pokročilé regulární výrazy (skupiny, chování flagu g).
- Základy podmínek, vyrovnání se s chybovými stavy.
- Podmínky if, case.
- Cykly: while, for, while read ... < file
- Úlohy ze cvičení.
- Vypište všechny nadpisy (<h?>, kde ? je 1-7) HTML stránky.
- Setřiďte posloupnost nul a jedniček tak, aby nejdříve byly všechny nuly,
potom až jedničky.
- Vypište dva libovolné sloupce /etc/passwd v obráceném pořadí.
- Vytvořte index HTML stránky (přes hypertextové odkazy) (nepovinné, může
být těžké)
- Napište cyklus, který pro každý soubor v domovském adresáři napíše, jestli
je to soubor, nebo adresář. Symlinky a podobné věci neuvažujte.
- Napište cyklus, který přečte seznam souborů ze souboru a zjistí, jestli
existuje (relativně k pracovnímu adresáři).
- Napište cyklus, který odpočítá 20 sekund a postupně bude aktulizovat
zbývající čas.
6. hodina
- Cvičení na regulární výrazy
- Cvičení na podmínky a cykly
- Nové úlohy ze cvičení.
- Zautomatizujte escapování řetězce pro použití v regulárním výrazu.
(tj. escapuje všechny metaznaky BRE)
7. hodina
- Přístupová práva - chown, chmod
- Vyhledávání pomocí find
- Úlohy ze cvičení.
- Napište script, který v daném adresáři a všech jeho podadresářích
rekurzivně nastaví práva tak, aby každý adresář šel procházet (tj. executable bit)
a žádný soubor neměl práva na spuštění.
- Napište script, který jako argumenty vezme právě jedno číslo K a bude si
"myslet" číslo 1-K. Uživatel bude hádat myšlené číslo a script odpovídat
"více" nebo "méně". Kdo chce, může si zkusit těžší variantu, že script může
maximálně jednou lhát.
- Napište script "cow says" - z daného souboru načte náhodnou větu a vypíše
ji.Byly tři varianty: každá věta na jednom řádku, nebo se občas vyskytnul volný řádek
(bylo třeba ho ignorovat), nebo byly jednotlivé věty oddělovány volným řádkem.
8. hodina
- Programování v sedu
- Parsování optionů scriptu, getopts
- Úlohy ze cvičení.
- Napište si script, který přehledně vypíše předané argumenty dané optionama.
- Napište script, který vynechá násobné prázdné řádky. (sed)
- Napište script, který vypíše řádky v souboru v opačném pořadí. (sed)
- Napište script, který nalezne v souboru s citátama z minulého cvičení
citáty od daného autora (předpokládejme, že každý citát je ukončen řádkou tvaru:
--- autor
9. hodina
- Pokročilé příklady v sedu
- Úlohy ze cvičení.
- Napište script v sedu, který vypíše každý řádek pozpátku.
- Napište v sedu script, který dostane na každé řádkce číslo a to zvětší o 1.
(nikdy nepoužívejte v životě, ale je to dobré cvičení)
- Napište script v sedu, který proparsuje Cčkový zdroják a spojí hlavičku
každé funkce na jeden řádek. Tj. například:
void function(
int arg1,
int arg2) { ...
spojí na:
void function ( int arg1, int arg2 ) { ...
Nápověda: každá definice funkce končí znakem { nebo ;.
10. hodina
- Základy programování v AWK
- Úlohy ze cvičení.
- Napište script, který ze souboru s docházkou formátu:
2010-04-28 09.00 14.00 činnost
...
Vytvoří výkaz hodin podle dnu (tj. 28.4. odpracováno xx hodin) a na konec
vypíše součet všech hodin a peníze k vyplacení za odvedenou práci.
- Napište script v AWK, který spočítá počet funkcí, procedur a řádek v těle
programu napsaném v jazyce pascal. Předpokládejte, že každá funkce/procedura
začíná na svém řádku a nejsou žádné dopředné deklarace.
- Mějte zadaný vstupní soubor:
A,1,2,B,3,4
C,5,6,D,7,8
Nechť [1,2] jsou souřadnice bodu A v metrickém prostoru R^2 s euklidovskou
metrikou. Vypočítejte vzdálenost bodů na řádce (tj. A-B, C-D).
11. hodina
Na této hodině se psala zkoušková písemka nanečisto.
12. hodina
- Opakování.
- Úlohy ze cvičení.
-
Napište program v AWK, který bude sloužit jako kalkulačka s pamětí. Bude mít několik vestavěných příkazů:
- let x = konstanta
- let x = výraz
- výraz - vypíše hodnotu vyrazu
- last - vypíše poslední výsledek
- int x - vypíše celočíselnou hodnotu x
- let a = int x - do a přiřadí celočíselnou hodnotu x (tato konstrukce se nemůže vyskytnout ve výrazu)
S tím, že x je proměnná a může mít libovolný počet znaků. Last je speciální proměnná uchovávající poslední hodnotu.
Výraz je poskládán pouze ze znamének +-*/, číselných konstant a identifikátorů proměnných.
Výchozí hodnota proměnné je 0. Výraz může být v infixovém, postfixovém nebo prefixovém tvaru (podle vaší
volby)
13. hodina
- Zamykání souborů.
- Zpracovávání signálů.
- Úlohy ze cvičení: viz 13. domácí úkol
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
- Poslat mi email s vašim jménem (do předmětu napište třeba "Cvičení z unixu")
- 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.
- 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)
- 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
- Připravit si dotazy na další cvičení (v případě, že něco nebylo jasné).
- 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
- 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
-
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
-
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 :-)))
-
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 :-))
- 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
-
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
- 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 ``.''
- 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
- 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í.
- 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.
- 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)
- Dejte si pozor na zamykání souborů a korektní handlování chyb!
- 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
- PuTTY - SSH klient pro windows