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í)
- čí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ě,
- zápis čísla zadaného jako argument v desítkové soustavě v soustavě o základu 2 až 64 (...).
[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]