Informácie

Cvičiaci: Mgr. Ladislav Maršík
Termín cvičení: Piatok 10:40, SU2
Kontakt: marsik@ksi.mff.cuni.cz
Konzultácie: miestnosť 309, KSI MFF UK, Štvrtok 11:00 - 12:00 / po dohode emailom

Body

Pošlite mi prosím do 29.2. email na marsik@ksi.mff.cuni.cz, s obsahom: Meno, Priezvisko, Nick

Na úspešný zápočet je potrebné dosiahnúť aspoň 1/3 bodov. 2/3 bodov znamená okamžitý zápočet, pri 1/3 bodov budú nasledovať dodatočné úlohy, ktoré vynahradia chýbajúcu 1/3.

Body sa získavajú formou domácich úloh. Tie treba odovzdať do Stredy pred cvičením 23:59 odoslaním na marsik@ksi.mff.cuni.cz (kód prosím skopírujte do tela mailu).

Nick 1.cvičenie 2.cvičenie 3.cvičenie 4.cvičenie 5.cvičenie 6.cvičenie 7.cvičenie 8.cvičenie 9.cvičenie 10.cvičenie 11.cvičenie 12.cvičenie BONUS suma
CaiusBonus3332.52.522.52.5324
Jdinaparek33333332.5326.5
LK230.53339.524
Mario3332.5314.5
Darkwave332.5333118.5
hbxn332.52331.521.52.524
mishoiv32.5333332.51.524.5
Jerrys332.5332.532.52.50.525.5
Meijix2.5332.5331.52.51.5325.5
strom333331.51.518
ELK33332.53330.524
neviem uš332.52.52.5231.52.52.525
Antonin23332.53331.524
unix3333232.51.51.51.52.53326.5
20
surikata3332.53333326.5
Eharne33332.53331.525
Protton3332.522.532.51.5225
Ghort3332.53333124.5

Guru test

Oslobodení od domácich úloh a zbierania bodov sú tí čo zvládli Guru test na prvom cvičení:

paliguru

Cvičenia


Cvičenie č.1 26.2.2016: back to top

Základní příkazy, ovládání shellu.

Trochu podrobněji:

  • Editace příkazové řádky: Ctrl-a, Ctrl-e, Ctrl-h, Ctrl-r, kurzorové šipky i nahoru a dolů, Ctrl-d, Ctrl-k (smaže text od pozice kurzoru do konce řádku).
  • Příkazy: man, ls, cd, pwd, cat, more, less (není standardní), head, tail, wc, mkdir, rmdir, cp, mv, rm, echo.
  • Shellová expanze: *, ?, [výčet], [!výčet], apostrofy a uvozovky, soubory s názvy začínajícími tečkou.

Příklady:

  1. Ve svém domovském adresáři vytvořte adresář ADR
  2. Do tohoto adresáře okopírujte soubory z adresáře /usr/include, jejichž názvy začínají znakem m, končí příponou .h a kromě toho v názvu obsahují číslici.
  3. V adresáři ADR vytvořte podadresář PODADRESAR.
  4. Prvních pět řádek z každého z okopírovaných souborů uložte do souboru ~/ADR/PODADRESAR/prvnichpet.
  5. Poslední řádky souborů v ~/ADR uložte do souboru ~/ADR/PODADRESAR/posledni.
  6. Soubory v ~/ADR/PODADRESAR spojte do jednoho souboru ~/ADR/PODADRESAR/prvniaposledni.
  7. Smažte soubory v ~/ADR/PODADRESAR kromě prvniaposledni.
  8. Do souboru ~/ADR/PODADRESAR/pocet uložte počet souborů a adresářů v ~/ADR.
  9. Vypište dlouhé informace o adresáři ~/ADR/PODADRESAR, ne jeho obsah.
  10. Vymažte obsah souboru ~/ADR/PODADRESAR/prvniaposledni bez toho, abyste smazali tento soubor.
  11. Do souboru ~/ADR/PODADRESAR/prvniaposledni přidejte řádku, jež obsahuje jen znak hvězdičky, tj *.
  12. Smažte ~/ADR i se všemi soubory a podadresáři v něm umístěnými.
Řešení
ukázat

Domáca úloha č.1:

  1. Napište příkaz, který vypíše všechny názvy souborů a adresářů ve vašem domovském adresáři, které začínají tečkou „.“ a obsahují alespoň 2 znaky kromě tečky. [1 bod]
  2. Napište příkaz, který vypíše poslední řádku z každého souboru v adresáři /usr/include, jehož název končí „.h“. [1 bod]
  3. Napište příkaz, kterým okopírujete všechny soubory z adresáře /usr/include/, jejichž jména nezačínají číslicí, ale číslici v názvu obsahují, do vašeho domovského adresáře. [1 bod]

Cvičenie č.2 4.3.2016: back to top
  1. Vypište řádky číslo 11-20 ze souboru /etc/passwd.
  2. Vytvořte soubor se jménem „-f“, který bude obsahovat jednu řádku s aktuálním datem. Poté tento soubor smažte.
  3. Vytvořte soubor „pevne datum“ (tj. „pevne<mezera>datum“) jehož čas poslední modifikace bude nastaven na 13:30 1.2. 2009.
  4. Do svého domovského adresáře okopírujte soubor /etc/passwd, kopie tohoto souboru se bude jmenovat ucty a bude mít čas poslední modifikace shodný s časem poslední modifikace /etc/passwd.
  5. Nastavte datum poslední modifikace souboru ucty (ve vašem domovském adresáři) na čas poslední modifikace souboru /etc/group.
  6. Napište příkaz, který vypíše obsah adresáře /usr/bin podle jmen sestupně podle abecedy do souborů bina a binb a navíc jej vypíše na obrazovku stránkovaně (pomocí less nebo more)
  7. Rozmyslete si, co se děje při následujících příkazech:
    1. mv soubor /dev/null
    2. cp soubor /dev/null
    3. cat soubor >/dev/null
  8. Vypište deset největších souborů a pak deset nejmenších souborů v adresáři /etc
  9. V adresáři /usr/bin najděte soubor, který byl modifikován naposledy.
Řešení
ukázat

Domáca úloha č.2 (prosím DO STREDY 9.3.2016 23:59)

  1. Vypište počet skupin v systému (řádků v /etc/group) [1 bod]
  2. Napište příkaz, kterým nastavíte datum a čas poslední modifikace souboru na 11.3.1993 15:04. [1 bod]
  3. Vypište jméno druhého největšího souboru v adresáři /usr/bin. [1 bod]


Cvičenie č.3 11.3.2016: back to top

Práva a jednoduché utility. Pozor, v laboch použite adresár /tmp na skúšanie, pretože tam práva fungujú správne.

Příkazy: who, who am i, id, mesg, write, talk, mail (mailx), last (tento příkaz není ve specifikaci a není proto standardní) chmod, chgrp, chown, file, df, du, umask.

  1. Napište příkaz, který vypíše vaše aktuální UID.
  2. Napište příkaz, který vypíše seznam skupin, v nichž se nacházíte.
  3. Pošlete obsah souboru /etc/group mejlem příkazem mail.
  4. Vyzkoušejte si příkaz df ke zjištění obsazeného místa na disku s různými parametry (-k a -P, můžete si zkusit i další, ale všimněte si, že kromě -t nejsou už další parametry ve specifikaci).
  5. Vyzkoušejte si příkaz du na adresáři /tmp nebo na vašem domovském adresáři s různými parametry (-k, -s, -x).
  6. Vytvořte jednoduchý skript a přidělte mu práva pro spuštění.
  7. Vytvořte soubor, který může vlastník spustit, číst a psát do něj, členové skupiny jej mohou číst a psát do něj, ostatní jej mohou jen spustit.
  8. Zkuste vytvořit skript, který nelze číst, ale má práva na spuštění, zkuste jej spustit. Proč to u shellového skriptu nejde?
  9. Vytvořte adresář, do kterého může kdokoli přejít a přidávat soubory, ale jen vlastník smí vypsat obsah adresáře.
  10. Vytvořte adresář, do něhož lze přejít, nelze číst jeho obsah a lze v něm přidávat soubory. Vytvořte v tomto adresáři soubor, k němuž budete mít práva jen ke čtení a zkuste ho smazat.
  11. Okopírujte /etc/passwd do /tmp jednak pomocí cp, jednak pomocí cp -p a koukněte se pomocí ls -l, jaký je mezi těmito kopiemi rozdíl.
  12. Spusťte si vimtutor cs
Řešení
ukázat

Domáca úloha č.3 (prosím DO STREDY 16.3.2016 23:59)

  1. Napište příkaz, kterým všem souborům v podstromu adresáře /tmp/adresar přidáte právo ke čtení všem členům skupiny a současně právo ke čtení zruší ostatním (tj. těm, kdo nejsou vlastníci ani členové skupiny). [1 bod]
  2. Vytvořte soubor a přidělte mu práva tak, aby jej mohl vlastník spustit, číst i zapisovat do něj, členové skupiny jej mohli spustit a číst, ostatní jej mohou jen číst. V příkazu chmod použijte jednak symbolický zápis práv [1 bod] a jednak octalový zápis práv [1 bod].

Cvičenie č.4 18.3.2016 back to top

Príkazy: ln, diff, cut, paste, tr, sort.

Príklady:

  1. Vytvořte ve svém domovském adresáři link na /etc/passwd, zkuste nejprve vytvořit hard link a poté soft link (rozmyslete si, proč hard link vytvořit nelze). Vyzkoušejte, jak se při ls -l zobrazí soft link.
  2. Stáhněte si soubor calories.csv, jde o soubor ve formátu CSV, kde je jako oddělovače sloupců použito středníku.
  3. V souboru calories.csv nahraďte uvozovky pomocí apostrofů.
  4. Ze souboru calories.csv odstraňte apostrofy (stejně jako dále předpokládám, že soubor byl změněn předchozími příklady, tedy zde jsou po předchozím příkladu apostrofy na místě původních uvozovek).
  5. Ze souboru calories.csv vypište jen první sloupec, tj. sloupec se jmény potravin.
  6. V souboru calories.csv nahraďte velká písmena malými, ale jen v prvním sloupci. (Postup: Vyříznutí prvního sloupce pomocí cut, náhrada pomocí tr, připojení zpět pomocí paste)
  7. V souboru calories.csv nahraďte čárky pomocí pomlčky a pomocí diff se podívejte, které řádky byly změněny.
  8. Soubor calories.csv seřaďte podle množství calorií sestupně, první řádka s hlavičkou musí zůstat na svém místě.
  9. Soubor calories.csv seřaďte podle trojice (protein, karbohydráty, tuk) vzestupně. První řádek s hlavičkou musí zůstat na svém místě.
  10. Ze souboru calories.csv vypište počet různých použitých jednotek (druhý sloupec).
  11. Soubor calories.csv upravte tak, aby poslední tři sloupce byly v opačném pořadí (tj. ve výsledku bude nejprve množství proteinů, pak karbohydrátů a pak tuků, použijte cut a paste).
  12. Z výstupu ls -l vyberte pouze 9 znaků s právy.
  13. Předpokládejte, že máte tři soubory, scitanec1, scitanec2 a soucet, každý z nich obsahuje stejný počet řádků s čísly. Sestavte tyto řádky do tvaru
    scitanec1+scitanec2=soucet.
  14. Vypište seznam souborů v aktuálním adresáři ve tvaru „velikost jméno“, seznam vytvořte úpravou výpisu ls -l a ls.
  15. Vypište loginy ze souboru /etc/passwd po pěti na řádek, na každém řádku jsou oddělené čárkami.
  16. BONUS k ln: Vytvořte hard link v /tmp na jiný soubor v /tmp. Vyzkoušejte si výpis ls -l a všimněte si, jak se změnilo číslo v druhém sloupečku. Pomocí ls -i zkontrolujte, že obě kopie mají stejné číslo inode.

Riešenia
ukázat

Domáca úloha 4 (prosím do stredy 23.3.2016 23:59) riešenia

  1. V souboru calories.csv nahraďte každý název potraviny (tj. první sloupec) jediným znakem „-“. Ostatní sloupce zůstanou beze změny. [1 bod]
  2. Vypište dvojice uid:login za každého uživatele v /etc/passwd. [1 bod]
  3. Určete počet různých států, které se vyskytují v souboru ip-by-country.csv. [1 bod]

Cvičenie č.5 1.4.2016 back to top

Príkazy: find, začiatok xargs a grep.

  1. V podstromu adresáře /usr/include najděte soubory, které jsou v podstromu adresářů v hloubce alespoň 2 a nejvýš 3.
  2. V adresáři /etc najděte soubory, které jsou novější než /etc/passwd
  3. V podstromu adresáře /bin najděte soubory, které vlastní root a jsou spustitelné jen pro vlastníka a členy skupiny, nikoli pro ostatní.
  4. V adresáři /etc najděte soubory, které patří skupině stunnel a pro každý vypište dlouhé informace pomocí ls -l.
  5. Zkuste rozdíl mezi echo $PATH; echo "$PATH"; echo '$PATH';
  6. Zkuste rozdíl mezi echo *; echo "*"; echo '*';
  7. Vypište seznam cest obsažených v $PATH s tím, že bude každá na samostatném řádku a ve výpisu nebudou obsažený oddělovací znaky „:“.
  8. Vypište dlouhý výpis adresářů obsažených v $PATH, lépe řečeno dlouhé informace o nich, ne jejich obsah
  9. Zjistěte, ve kterých adresářích uložených v proměnné $PATH se vyskytuje program awk.
  10. Ze souboru calories.csv vyberte řádky, v nichž název potraviny obsahuje alespoň tři znaky.
  11. Napište příkaz, který vypíše všechny (pro vás viditelné) soubory nebo adresáře, které mají ve jménu podřetězec 'bin' v podstromu aktuálního adresáře.
  12. Vypište všechny symbolické linky z adresáře /etc, nezahrnujte celý podstrom, jen to, co je přímo v adresáři /etc.
  13. Z podstromu adresáře /usr/bin vypište soubory, na které ukazují alespoň tři hardlinky.
  14. V podstromu adresáře /tmp najděte všechny soubory, které jsou větší než sto kilobyte a jsou čitelné pro všechny.
Riešenia
ukázat
Domáca uloha 5 (prosím do stredy 6.4.23:59) riešenia
  1. Napište příkaz, který vypíše počet všech (pro vás viditelných) adresářů v podstromu /etc. [1 bod]
  2. V podstromu aktuálního adresáře najděte soubory, které mají nulovou velikost. [1 bod]
  3. V podstromu adresáře /usr/include najděte soubory, jejichž jméno začíná řetězcem "std" a nekončí příponou ".h". [1 bod]
Cvičenie č.6 8.4.2016 back to top

Príkazy: comm, join, split.

  1. Stáhněte si soubory countrycodes_en.csv a kodyzemi_cz.csv. Obojí jsou soubory ve formátu CSV, kde je jako oddělovače sloupců použito středníku.
  2. Ze souborů countrycodes_en.csv a kodyzemi_cz.csv vytvořte výpis zemí se dvěma sloupci oddělenými rovnítkem ve tvaru
    český název=anglický název (bez uvozovek).
  3. Vypište názvy souborů, které se nacházejí /usr/bin i v /bin.
  4. Vypište čísla skupin, která jsou v /etc/group, ale nejsou použita v /etc/passwd.
  5. Rozdělte soubor na kusy po pěti řádcích a pak jej zase spojte do jednoho souboru.
  6. Vypište loginy ze souboru /etc/passwd do deseti řádků, na každém řádku jsou loginy oddělené mezerami.
challenge - vytvořte přemenovač souborů
Riešenia
ukázat
Domáca úloha 6 (prosím do stredy 13.4.23:59) riešenia
  1. Na základě obsahu souborů countrycodes_en.csv a kodyzemi_cz.csv vypište názvy států, které se jmenují stejně v angličtině jako v češtině. [1 bod]
  2. Rozdělte soubor /tmp/zlobr na části po 3 řádcích a potom tyto části poskládejte v opačném pořadí zpátky do zlobra (/tmp/zlobr) - tj. když byly v zlobrovi nejprve první 3 řádky hlava1\nhlava2\nhlava3, pak další 3 telo1\ntelo2\ntelo2, atd., tak na konci budou v zlobrovi poslední 3 řádky hlava1\nhlava2\nhlava3, předposlední telo1\ntelo2\ntelo2, atd. [1 bod]
  3. A. Vytvořte soubor piskvorky, který obsahuje 3 řádky:
    X O X
    O X O
    O X O
    
    Zabezpečte, aby hráč X nebo O vyhrál, tj. měl ve výpisu příkazu 3 své znaky za sebou v řádku, sloupci, nebo uhlopříčke (můžou vyhrát i oba). Můžete použít jenom 1 řádek příkazu, ve kterém máte dovoleno použít (v libovolném počtu) jenom: cat, echo, xargs (+ příslušné přepínače), název souboru (piskvorky), a kontrolní znaky |,<, >. Jako parametry nelze použít znaky X a O, ani řetězec obsahujíci znaky X nebo O. Velkost hrací plochy se může změnit, je jenom potřeba aby byla obdélniková / čtvercová. [0.5 bodu]

    B. Stejně jak v části A., ale namísto xargs máte dovoleno použití paste (+ přepínače) [0.5 bodu]
Cvičenie č.7 15.4.2016 back to top

Příkazy: sed, ed, nl.

  1. Pomocí sedu vyberte z výpisu ls -l jen sloupec s velikostí souboru.
  2. Pomocí sedu přetvořte řádky /etc/passwd do podoby uid (login).
  3. Z výstupu nl /etc/passwd vypište jen sudé řádky.
  4. Na začátky lichých řádek souboru /etc/passwd vložte znak „l“, na začátky sudých řádek vložte znak „s“.
  5. Na začátky desáté až dvacáté řádky souboru /etc/passwd přidejte znak #.
  6. Před první řádku vstupního souboru vložte řádku s #!/bin/sh.
  7. Napište skript pro sed, který odstraní ze shellového skriptu komentáře, přičemž
    1. Pokud jde o první řádku souboru a pokud tato řádka má formát ^#!.*, pak tento komentář neodstraňujte.
    2. Řádky, kde před # není nic než mezery, odstraňte úplně.
    3. Pokud se před # vyskytují nějaké jiné znaky, odstraňte z řádky vše od prvního výskytu znaku # (včetně) do konce řádky.
  8. Napište skript pro sed, který otočí pořadí řádek na vstupu.
  9. Mezi každé dvě řádky souboru /etc/passwd vložte prázdnou řádku.
  10. Napište skript pro sed, který na každé řádce nahradí jednořádkové komentáře typu /* ... */ komentářem typu //..., uvažte, že na řádku může být těch jednořádkových komentářů víc a že kolem komentářů je i obyčejný text. Z jednoho řádku tak vznikne víc řádek, protože za každým komentářem // musíte odřádkovat.
challenge - vytvořte resizer obrázků
Riešenia
ukázat

Domáca úloha 7 (prosím do stredy 20.4.2016 23:59) riešenia

VYBERTE si 2 z týchto príkladov, ktoré chcete odovzdať ako DÚ.
(Kľudne pošlite aj tretiu úlohu, opravím ju ale nebude sa rátať do DÚ)
  1. Pomocí sedu ve vstupním textovém souboru nahraďte výskyty znaků '&', '<', '>' pomocí jejich HTML entit ('&' pomocí '&amp;', '<' pomocí '&lt;' a '>' pomocí '&gt;'). [1.5 bodu]
  2. Pomocí sedu ve vstupním souboru spojte vždy dvě následující řádky do jedné (tj. odstraňte odřádkování mezi nimi). Ve výsledku tedy bude spojena 1. s 2. řádkou, 3. se 4. řádkou, 5. s 6. řádkou, atd. [1.5 bodu]
  3. Předpokládejte, že řádky vstupního souboru obsahují jen znaky '(' a ')' (tj. na každé řádce je řetězec vyhovující regulárnímu výrazu „[()]*“), vytvořte skript pro sed, který zkontroluje, zda je řetězec na řádce správně uzávorkovaný. Pokud ano, nahradí řádku řetězcem 'ano', v opačném případě řetězcem 'ne'. [1.5 bodu]

Cvičenie č.8 22.4.2016 back to top

Příkazy: printf, read, řídící struktury (for, while, if, case, a pod.), printf, expr, test, dirname, basename.

  1. Napište skript, který dostane v parametrech seznam souborů zadaný cestami, které můžou být i relativní. Ke každému souboru vypíše řádek s absolutní cestou.
  2. Napište skript, který přejmenuje všechny soubory v aktuálním adresáři na soubory se týmž jménem, kde jsou velká písmena změněná na malá. (Například soubor 'ZALOHA.ZIP' by přejmenoval na 'zaloha.zip')
challenge - vytvořte resizer pro videa
Riešenia
ukázat

Domáca úloha 8 (prosím do stredy 27.4.2016 23:59) riešenia

  1. Napište skript, který přejmenuje všechny soubory v aktuálním adresáři s příponou ".jpeg" na soubory s týmž jménem, ale příponou ".jpg". (Zkuste využít expanze ${proměnná%přípona}, sed, nebo dirname a basename.)
  2. [1 bod]
  3. Napište skript, který očekává dva parametry, název souboru a číslo (označme si ho teď x). Ze zadaného souboru řádku číslo x nahradíme řádkou s obsahem haha. Použijte shell script v kterém zavoláte ed (inspirujte se ed příkladmi z minulého cvičení, s využitím <<KONEC pro označení začátku a konce interaktivního zadávaní příkazů). [1 bod]
  4. Napište skript, který očekává dva parametry, oba obsahují cestu k adresářům, zdrojovému a cílovému, přičemž cílový dosud neexistuje. Skript zduplikuje adresářovou strukturu do cílového adresáře. Soubory v adresářích nekopíruje a ignoruje je, vytváří jen kopii adresářové struktury. Například volání
    skript /etc ~/etc
    by v domovském adresáři vytvořilo podadresář etc, pod ním by byl stejný podstrom adresářů jako je v /etc (bez kopií souborů v nich obsažených). [1 bod]

Cvičenie č.9 29.4.2016 back to top

  1. Napište skript, který dostane tři parametry, všechny číselné, a vypíše na standardní výstup čísla oddělená mezerami počínaje $1, konče $2 a s krokem $3. Pokud skript dostane jen dva parametry, pak se implicitně použije krok 1.
  2. Totéž jako předchozí příklad, ale čísla budou každé na zvláštní řádce a budou zarovnaná na počet míst daný délkou nejdelšího čísla (tj. délkou $2). Čísla budou zarovnaná nulami na začátku. Tj. například
    skript 0 10 2
    by vypsal:
    00
    02
    04
    06
    08
    10
    
  3. Napište skript, který přejmenuje všechny soubory v aktuálním adresáři s příponou jpg na soubory s touž příponou ale s čísly místo názvů, kde čísla budou zarovnaná na tolik míst, kolik je třeba pomocí nul. (Využijte toho, co jste už udělali v jednom z předchozích příkladů.) Tj. například pokud jsou v adresáři soubory alice.jpg, bob.jpg cyril.jpg a daniel.jpg, přejmenoval by je popořadě skript na 1.jpg, 2.jpg, 3.jpg a 4.jpg. Pokud by těchto souborů bylo alespoň deset ale méně než 100, byly by pojmenovány jako 01.jpg, 02.jpg, 03.jpg, 04.jpg, ...
  4. Napište skript, který očekává na standardním vstupu řádky ve tvaru:
    a+b=c
    kde a, b a c jsou čísla, skript načte pro každou řádku tato tři čísla a zkontroluje, jestli je rovnost správná. Pokud není správná, ohlásí chybu s číslem řádky, na které k ní došlo. Na závěr vypíše celkový počet chyb. (Doporučení: Použijte shellový while cyklus s read a b c a vhodnou volbou IFS (+=)).
Riešenia
ukázat

Domáca úloha 9 (prosím do stredy 4.5.2016 23:59) riešenia

  1. Napište skript, který očekává na standardním vstupu řádky ve tvaru 4 slov oddělených mezerami (na každém řádku, kontrolovat vstup nemusíte). Pokud některé řádky budou obsahovat tyto 4 slova (v libovolném pořadí, slova berte case-sensitive tj. velikost písmen přesně takto):
    your Windows needs updating
    vymažte tyto řádky a zbytek vstupu (zvyšní řádky) vypište na standardní výstup. (Doporučení: Tak jak v úloze 4. z cvičení, použijte shellový while cyklus s read. Pro testování: vícřádkový vstup můžete do vášho skriptu vložit spůsobem: cat vstup | ./skript.sh kde vstup je soubor obsahující víc řádků.). [1.5 bodu]
  2. Napište skript, který očekává tři parametry, soubor, číslo n a znak c. Pokud třetí parametr chybí, za znak c je považován mezerník (c=' '), pokud chybí i druhý parametr, uvažuje se navíc n=1. Skript potom provede cyklický posun doleva řádek podle položek oddělených znakem c s krokem n. Tj. například při volání
    skript /etc/passwd 2 :
    by každou řádku tvaru
    login:*:uid:gid:jméno:domovský adresář:shell
    upravil na řádku tvaru
    uid:gid:jméno:domovský adresář:shell:login:*
    Při volání
    skript vstup 3
    a použití na vstupní soubor z první domácé úlohy, tř. ve tvaru:
    Čau jak sa máš
    your Windows needs updating
    Sme kapela Horkíže Slýže
    
    bude výsledek:
    máš Čau jak sa
    updating your Windows needs
    Slýže Sme kapela Horkíže
    
  3. Upravený soubor vypisuje skript na standardní výstup, soubor zadaný v parametru neupravuje. [1.5 bodu]

Cvičenie č.10 6.5.2016 back to top

Příkazy: trap, ps, kill, top, sleep, date, eval.

  1. Podívejte se na výpis kill -l, vyskoušejte si: top, ps, ps [id], ps -C [process name], ps -C [process name] -o pcpu,pmem, ps aux
  2. Vyskoušejte si spustit proces na pozadí (background process) třeba top & a potom ho zastavte kill -9 [pid]
  3. Napište skript, který se donekonečna zacyklí (while true; do : done) ale předtím než to udělá, vytvoří dočasný soubor temp. Pomocí trap "rm temp; exit" SIGINT SIGTERM SIGKILL zabezpečte ostranení souboru při zastavení skriptu.
  4. Napište skript, který bude očekávat vstup na standardním vstupu, načtený vstup pouze zopakuje na svůj standardní výstup. Pokud skript dostane signál SIGKILL (9), tak samozřejmě skončí, ale pokud dostane signál SIGTERM (15), SIGQUIT (3), či SIGINT (2) (to je ten, který je poslán pomocí Ctrl-c), neskončí a jen vypíše číslo toho signálu, který takto obdržel. Při SIGINT navíc vypíše naposledy vypsanou řádku vstupu.
  5. Napište skript, který dostane signál a jméno programu, poté pošle signál všem procesům daného programu. Můžete předpokládat, že se program jmenuje normálně a název neobsahuje žádné divné znaky (mezeru ale obsahovat může). (Něco jako killall, ale killall není standardní příkaz. Doporučuji podívat se na parametr -o příkazu ps. Dále se hodí třeba sed a xargs)
  6. Napište skript, který dostane jeden číselný parametr s počtem sekund. Skript potom počká zadaný počet sekund a skončí. Pokud skript obdrží signál SIGINT (2 - Ctrl-C), tak vypíše, kolik sekund už od začátku uběhlo. Pokud obdrží signál SIGQUIT (3 - Ctrl-\), tak vypíše, kolik ještě zbývá sekund do konce, ale svůj běh nezastaví. Pokud skript obdrží signál SIGTERM (15), vypíše, kolik uběhlo sekund od začátku, kolik zbývá do konce a skončí. Návratová hodnota skriptu je buď 0, pokud skončil ve správný čas, nebo zbývající počet sekund, pokud skončil kvůli SIGTERM.
    Nepoužívejte date +%s, %s není standardní součást formátovacího řetězce pro date. Použijte sleep v cyklu.
  7. Napište skript cutreorder, který se bude chovat podobně jako cut, bude mít parametry -d a -f, které budou mít týž formát a význam jako u cut, v dalších parametrech budou názvy souborů (pokud nebudou uvedeny, čte se standardní vstup). Rozdíl je v tom, že skript cutreorder na výstupu umístí sloupce v pořadí daném parametrem -f (v cut jsou sloupce vypisované v pořadí, v jakém jsou ve vstupním souboru). Například
    • cutreorder -d : -f 3,1 /etc/passwd by vypsalo z /etc/passwd do dvou sloupců uid:login.
    • cutreorder -d : -f 3,3-5,1 /etc/passwd by vypsalo sloupce uid:uid::gid:full name:login.
  8. Napište skript, který dostane jako parametr název souboru, skript očekává poté na standardním vstupu posloupnost čísel, každé je na nové řádce a je indexem řádky, kterou má skript vypsat. Skript implementujte tak, že nejprve načte řádky souboru do pole, které implementujete pomocí eval (tj. eval '$'POLE_$INDEX), poté dotazy zodpovídejte přístupem do tohoto "pole".
Riešenia
ukázat

Domáca úloha 10 (prosím do stredy 11.5.2016 23:59) riešenie

  1. Napište skript pro spouštění příkazu pomocí e-mailu, na standardní vstup dostane soubor následujícího tvaru:
    From:<addr>
    Subject:<cmd>

    <input>
    ...

    Skript spustí příkaz <cmd> a na standardní vstup mu dá <input>. Návratový kód (tj. $?) pošle zpět na adresu <addr> v subjectu, v těle mejlu posílaného zpět bude obsah standardního výstupu spuštěného programu.
    Upřesnění:
    • Místo <addr> je pochopitelně skutečná adresa, místo <cmd> je skutečný příkaz i s parametry (které by měl shell zpracovat) a místo <input> je text, který se předá tomu příkazu. Třetí řádka je prázdná.
    • Skript nedostane žádné parametry, vstup dostane na standardním vstupu. Vstup ale musí být dobře ošetřený - zlý formát, i prázdný vstup
    • Parametry příkazu jsou uvedené v rámci subjectu, na standardní vstup dostane obsah mejlu od 4. řádky včetně dál.
    [3 body]
Cvičenie č.11 13.5.2016: back to top
  1. Napište awk skript, který vypíše každou desátou řádku vstupu.
  2. Napište awk skript, který v souboru /etc/passwd převede písmena v loginech na velká.
  3. Napište awk skript, který otočí pořadí slov na každé řádce vstupu (napíše je v opačném pořadí)
  4. Napište awk skript, který očísluje řádky na vstupu a vypíše je i s čísly (jako nl).
  5. Napište awk skript, který vypíše tolik náhodných čísel mezi 0 a 1, kolik dostane zadáno parametrem.
  6. Napište awk skript, který z výstupu getent passwd) vypíše plná jména uživatelů, jejichž login má tvar čtyři písmena následovaná čtyřmi číslicemi.
  7. Napište awk skript, který vypíše počet linků, tedy tagů <a ve vstupním html souboru.
  8. Napište awk skript, který dostane na vstupu html soubor a vypíše adresy, na které se tento soubor odkazuje (to jest za značku <a href="adresa"> vypíše adresa). Pozor na to, že ta značka může být rozložena přes víc řádků a můžou tam být kolem a, href mezery. Volbou vhodného RS a FS si výrazně usnadníte práci.
  9. Napište awk skript, který v textu zakomentuje všechny odstavce, které začínají komentářovým řádkem. (To jest, před druhou a další řádky tohoto odstavce předřadí komentářový znak.) Znak uvozující komentář je '#'. Odstavce se oddělují prázdným řádkem.
  10. Napište awk skript, který vypíše posledních 10 řádků souboru.
  11. Napište awk skript, který na vstupu očekává soubor ve formátu csv, tj. na každé řádce jsou položky oddělené čárkami, přičemž je jich na každé řádce stejně. První řádka obsahuje hlavičku, tj. názvy sloupců, první sloupec následujících řádků obsahuje název řádku. Na dalších pozicích jsou čísla. Skript k tomuto vstupu přidá na výstupu nový sloupec se jménem „Součet“, který na každém řádku bude obsahovat součet číselných položek na daném řádku. Tj. například ze vstupu
    Jméno,body1,body2,body3
    Hynek,3,12,9
    Jarmila,7,34,1
    Vilém,8,27,0
    
    vytvoří na výstupu
    Jméno,body1,body2,body3,Součet
    Hynek,3,12,9,24
    Jarmila,7,34,1,42
    Vilém,8,27,0,35
    

Riešenia
ukázat

Domáca úloha 11 (prosím do stredy 18.5.2016 23:59) riešenia

  1. Napište awk skript, který formátuje soubor po odstavcích do zadaného počtu sloupců (=znaků na řádek). Jednotlivé odstavce jsou od sebe odděleny volným řádkem, tj. několik řádek za sebou tvoří týž odstavec, pakliže mezi nimi není žádná prázdná řádka. Program vždy vezme odstavec a napíše ho na co nejmenší počet řádků tak, aby k přechodu na nový řádek nedocházelo uprostřed slova. Počet sloupců bude zadaný jako parametr předaný pomocí -v. [3 body]
Cvičenie č.12 20.5.2016 back to top
  1. Napište program na vyhledávání řádek se zadaným textem (1. parametr) v souboru s příchozí elektronickou poštou (2. parametr). O každém dopisu, v němž program najde nějakou řádku, je třeba vypsat do záhlaví základní informace (adresu odesílatele, datum a čas doručení a předmět dopisu) a poté text všech nalezených řádek. Příklad je z knihy Shell v příkladech od L. Forsta, kapitola 6.4, kde najdete řešení i podrobný komentář - doporočuju k přípravě na zkoušku.
    Poznámky k zadání: (na cvičení sme měli zjednodušenou verzi - hledání jenom v těle a v subject-e - ale připojím celé zadání):
    • Příchozí elektronické dopisy se v UNIXu ukládají každému uživateli chronologicky do jednoho souboru, jehož jméno bývá uloženo v systémové proměnné MAIL. Jednotlivé dopisy jsou od sebe odděleny tak, že dopis začíná zvláštní řádkou ve tvaru From ..., za níž následují hlavičky a tělo dopisu.
    • Počítejte s tím, že řádka hlavičky s předmětem dopisu může chybět. Dejte pozor také na případné výskyty řádek ve tvaru Subject: ... v těle dopisu. Takové řádky se do vypisovaného záhlaví dopisu nesmí promítnout - tam se smí zobrazit pouze obsah řádky Subject: ..., která byla v záhlaví (byla-li tam). Naproti tomu výskyty řádek ve tvaru From ... v těle dopisu nemusíte uvažovat.
    • Zadaný text se hledá i v řádkách s hlavičkami dopisů, může se tedy stát, že nějaké hledané řádky objevíte dříve než předmět dopisu. V úvodní oddělovací řádce dopisu From: ... se naopak text nehledá.
    Příklad souboru v kterém jsou uloženy maily:
    From adresa_odesilatele datum_a_cas_doruceni
    ... zacatek hlavicky
    Subject : predmet
    ... dalsi radky hlavicky
                                        prazdna radka oddelujici hlavicku
    ... text dopisu
                                    

    Požadovaný tvar výpisu:
    ==== From adresa_odesilatele datum_a_cas_doruceni predmet_dopisu
    ... nalezene radky
    ==== From adresa_odesilatele datum_a_cas_doruceni predmet_dopisu
    ... nalezene radky
                                        
Riešenia
ukázat

Rozdiely bash vs shell
výber
appendix bash manuálu

Domáca úloha 12 (prosím do stredy 25.5.2016 23:59) riešenie

  1. Napište skript rmexcept, který očekává n+1 parametrů, kde první parametr je adresář a další parametry jsou řetězce popisující názvy souborů (může jít o shellové masky) v tomto adresáři. Skript v zadaném adresáři vymaže všechny soubory, jejichž názvy nevyhovují maskám zadaným v parametrech. Soubory, které vyhovují zadaným maskám a názvům, skript nechá beze změny, přičemž se jich ani netkne (tedy speciálně nebude je přesouvat mimo a pak zpět). Například volání
    rmexcept . '*.jpg' '*.png'
    by v aktuálním adresáři vymazalo všechny soubory, které nemají příponu jpg ani png. [3 body]

BONUSOVÉ DOMÁCE ÚLOHY (prosím do stredy 25.5.2016 23:59)

  1. Vytvořte skript pro sed, který na řádce očekává číslo n zadané v desítkové soustavě. Na výstup vypíše sed čísla 0, 1, ..., n, každé na nové řádce. [3 body]
  2. Napište skript, který ze souborů jejichž názvy jsou zadané v parametrech, vybere n nejdelších řádek, u každé řádky je uvedeno pořadí ve vstupním souboru (ve formátu číslo řádky: řádka), řádky jsou na výstupu uspořádány podle pořadí ve vstupním souboru (tj. podle toho čísla před dvojtečkou na výstupu). Parametr n je implicitně 5, nebo může být zadán jako první jeden až dva parametry pomocí -n10, nebo -n 10 (to je pro příklad n=10, tj. syntaxe je stejná jako třeba u head). Pokud chybí parametry s názvy souborů, čte se standardní vstup. Pokud jsou zadány alespoň dva soubory, pak je výpis nejdelších řádek z každého souboru uvozen názvem souboru. [3 body]
  3. Napište skript, který bude ve vstupním textovém souboru provádět indentaci řádků podle hloubky zanoření daném závorkami. Parametry skriptu bude název znak indentace c, počet znaků na úroveň n a seznam souborů (pokud chybí soubory, čte se standardní vstup). Skript před každou řádku vloží k*n znaků c, kde k je hloubka zanoření počátku řádku v závorkách, uvažují se kulaté, hranaté a složené závorky. Pokud jsou před začátkem textu na řádce již prázdné znaky, tak jsou nejprve odstraněny. Například vstupní soubor
    a ( b
         c d [ e ] f [
      g h { j (
                k ) } l m
         n ] o ) p
    q r
    
    by volání skriptu s parametrem c='.' a počtem n=1 upravilo do následující podoby:
    a ( b
    .c d [ e ] f [
    ..g h { j (
    ....k ) } l m
    ..n ] o ) p
    q r
    
    Můžete předpokládat, že vstup je správně uzávorkovaný (pokud není, je chování nedefinované). Dá se očekávat, že znakem může být mezera nebo tabelátor. [3 body]
  4. Napište skript, který dostane počet sekund sec a název programu prg a poté následují argumenty, které je třeba programu předat. Skript spustí program a poté čeká, než skončí, pokud program neskončí do zadaného limitu daného parametrem sec, pak skript program ukončí odesláním signálu TERM. Poté počká 5 sekund a pokud ani poté program neskončil, pošle mu signál KILL, kterým program zabije.
    Pro jednoduchost můžete předpokládat, že interval daný počtem nezasahuje přes půlnoc do dalšího dne. [3 body]

Guru test

Napište skript, který ze souborů jejichž názvy jsou zadané v parametrech, vybere n nejdelších řádek, u každé řádky je uvedeno pořadí ve vstupním souboru (ve formátu číslo řádky: řádka), řádky jsou na výstupu uspořádány podle pořadí ve vstupním souboru (tj. podle toho čísla před dvojtečkou na výstupu). Parametr n je implicitně 5, nebo může být zadán jako první jeden až dva parametry pomocí -n10, nebo -n 10 (to je pro příklad n=10, tj. syntaxe je stejná jako třeba u head). Pokud chybí parametry s názvy souborů, čte se standardní vstup. Pokud jsou zadány alespoň dva soubory, pak je výpis nejdelších řádek z každého souboru uvozen názvem souboru.

Lab

UNIXový lab na Malé Strane má špecifické nastavenia, ktoré trochu menia prácu, naproti tomu ak by ste mali nainštalovaný vlastný Linux na Vašom PC. Odporúčam si pozrieť stránky UNIXové laboratoře na Malé Straně a vypisujem Vám tu zoznam vecí ktoré stoja za pozornosť:

  1. Domovské adresáře jsou umístěny AFS filesystému, kde nefungují standardní UNIXová práva (viz výše uvedená stránka, případně stránka o právech v u-labech)
  2. Pokud si tedy chcete zkoušet příkaz chmod a věci související se standardním UNIXovým systémem práv, čiňte tak v adresáři /tmp na tom kterém stroji, tam fungují tím standardním způsobem.
  3. /etc/passwd neobsahuje informace o vašich uživatelských účtech, protože ty jsou skladovány v dynamické databázi jinde a jinak, pokud potřebujete informace o uživatelských účtech ve formátu /etc/passwd, dostanete je příkazem getent následovně:
    getent passwd
    případně můžete přidat parametr specifikující, co vás zajímá, viz též getent --help.
  4. Totéž platí i pro /etc/group a getent group.
  5. Příkaz find si s filesystémem afs (nejspíš stále) nerozumí, nepoužívejte jej proto raději na síťových discích. Hledat pomocí find můžete v lokálních adresářích jako /tmp, /usr, /etc a podobně, ale raději ne ve vašem domovském adresáři. (Výsledek vyhledávání tam nelze zaručit.)