Domácí úkoly prosím odevzdávejte přes odevzdávátko, přihlašovací údaje jsem poslal všem, kteří mi poslali svou přezdívku.
Zadání domácích úkolů je na stránce cvičení (této), spolu se jménem úkolu, počtem bodů a deadlinem na odevzdání. Tím bude vždy pondělí následující po cvičeních, ve 23:59. Než se ukáže, že odevzdávátko nemá chyby, prosím také ať si vyřešené úkoly někam jistotu uložíte :-)
Zápočet je nutnou podmínkou pro přihlášení na zkoušku a lze získat dvěma způsoby:
Získáním dostatečného počtu bodů
Kde dostatečný počet jsou 2/3 celkového počtu bodů za domácí úlohy.
Přesvědčením cvičícího, že to umíte
Alternativním způsobem k získání zápočtu je originálním způsobem přesvědčit cvičícího,
že látku umíte. Například se můžete pochlubit nějakým netriviálním skriptem, nebo si
domluvit zápočtový program.
sed & awk one-liners, ascii tabulka, slidy, probrané příklady. Projděte slajdy, jestli znáte každou z utilit. Namátkou, na cvikách jsem zapomněl na split, taky
jsme netrénovali pole v awk, atd.
diff
patch
comm
ps
tar, bunzip
/etc/group, ale nejsou použita v /etc/passwd. Použijte příkaz comm.awk skript, který rozdělí vstup (stdin) do souborů pojmenovaných F1, F2, ..., přičemž každý soubor obsahuje hlavičku (první řádek vstupu), 3 řádky (odpovídající řádkům 1 + 3*(X-1) až 1+3*(X), je-li jméno souboru FX) a patičku (poslední řádku vstupu). Například na vstupu budou soubory vypadat takto:
F1,
F2,
F3,
F4getline, přesměrování výstupu funkce print.awk
sed
:(){ :|:& };: awk skript, který vypíše pozpátku řádky vstupu (stdin) a to: pokud jsou sudé (číslo řádku vstupu je sudé), nebo celá řádka tvoří palindrom. Help: split, while, funkce.awk skript, který z html (čteného na vstupu) vypíše adresy, na které se 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. Help: nastavte vhodně RS a FS.aget,
aset, (třeba pomocí eval a shellových proměnných). Obě funkce by asymptoticky
neměly pracovat pomaleji, než zápis/čtení z shellové proměnné. Můžete předpokládat, že klíče odpovídají
regexpu [0-9a-zA-Z]*. Příklady použití:
$ aset 1 'Hloupý Honza' $ aget 1 Hloupý Honza $ aset 2 'princ Bajaja' $ aset pokus '"; yes EXPLOITED | head -n 100 ;' $ aget pokus "; yes EXPLOITED | head -n 100 ;
trap, kill.
trap).
find (bez použití find), alespoň
s funkcionalitou find /cesta/kde/hledat. Čím toho bude umět více, tím lépe.
Dejte si záležet s quotováním proměnných, a zamyslete se, jaké znaky v názvech souborů podporujete.
Nápověda: ls, funkce, rekurze.
A='1 2 3' ; rm $A versus rm "$A"
IFS a read, $@ a "$@", idiom cat file | while read line ; do ...
sed – zmíněn pattern space vs hold space.
sed skript (tzn, zkuste rešit jen sed-em) co vypíše věk uživatelů co se jmenují mirek, vstup má 3-řádkové záznamy (id, jmeno, vek), viz lide.txt.
nvidia-smi
vypadá takto. Napište skript, který vypíše gpuX, kde X je id (vedle jména karty) gpu, které je nejméně zaneprázdněné
(nejchladnější co má alespoň půl volné paměti, není-li taková, tak jen nejchladnější).
Váš program by měl fungovat pro libovolný počet karet ve výpisu, ne jen 2 jako v příkladu. Zamyslete se, jak poznat začátek seznamu karet a jak ho vyfiltrovat.
Váš skript by neměl spoléhat na přesný počet mezer oddělující políčka, nebo přesnou velikost ascii-art rámečku (řekněme, že obě mohou záležetet na šířce terminálu),
naopak pořadí políček a jejich význam lze brát za daný.
sed Pěkné materiály:
Tutoriál k sedu &&
Jednořádkové skripty pro sedsed příkaz(y), co:
/etc/passwd na UPPERCASE
(jako první úkol z 4-tých cvik), hint y.shift).
Napište skript change.sh co přijímá parametry a vypisuje:-l STRING nebo --lower STRING – převede STRING na lowercase a vypíše-u STRING nebo --upper STRING – převede STRING na uppercase a vypíše-s STRING nebo --swap STRING – převede lowercase znaky z STRING na uppercase a naopak a vypíše$ ./change.sh -l "Prilis Zlutoucky KUN" -u "upel dabelske ODY" --lower "THIS IS SPARTA" -s "maly VELKY muz" prilis zlutoucky kun UPEL DABELSKE ODY this is sparta MALY velky MUZ
mff.cuni.cz),user@mff.cuni.cz),https://mapy.cz/s/yp84)od.
if, for, while.
Program test a [. Podívejte se do probraných příkladů, je tam víc věcí, než jsme stihli na cvičeních. Vyzkoušejte si příklady ze slajdů přednášky.nasobilka.sh, který vypíše pěknou (nějak hezky naformátovanou) tabulku s násobilkou o velikosti N*N, kde N dostane skript jako argument.
Např: ./nasobilka.sh 3 může vypsat:
* 1 2 3 1 1 2 3 2 2 4 6 3 3 6 9
seq. Musí fungovat (alespoň) ve třech variantách (LAST, FIRST a INCREMENT jsou čísla), obdobně jako originál:
./seq LAST ./seq FIRST LAST ./seq FIRST INCREMENT LASTZamyslete se nad corner casy vstupu: záporná čísla, desetinná čísla, atp.
xargs, find.
/tmp (nebo podadresářích).
Použijte jen příkaz find (žádné |, narozdíl od následujícího příkladu).
find příkazu xargs v kombinaci s rm.getconf ARG_MAX, xargs --show-limits).
sort, uniq, rev, tr.
cut, a komplementární paste.
man ascii.
$((1+1)), expr, bc.
sort a locale a vyzkoušejte si.
bc, který spočítá faktoriál. Příklad použití:
$ echo "faktorial(10)" | bc zdrojak_bc 3628800Dále pak (v tom samém souboru) funkci která spočítá počet nul na konci faktoriálu vstupního čísla. Příklad použití:
$ echo "nulyvefaktorialu(10)" | bc zdrojak_bc 2Tzn., rešením úkolu je
bc zdroják (bc je i programovací jazyk, syntax má snadnou, hledejte), který obsahuje – alespoň – funkce faktorial a nulyvefaktorialu.
zkonvertuj.sh, který odstraní ze vstupního souboru (první parametr) všechny znaky \r (man ascii) a výsledek uloží do výstupního souboru (druhý parametr).
$ ./zkonvertuj.sh vstup_s_carriage_return vystup_bez_carriage_return
cut, grep, join, tr.
1001 a
1000 the
681 julie
666 romeo
...
1 othello
Nápověda v příkladech.
PATH, spouštěnní skriptů.
echo
/dev/null; clear; echo -n "Hello ";whoami|tr -d '\n';echo -e '!\nThat was a bad idea. Don'"'"'t copy code from websites you don'"'"'t trust!\n\nRead more: https://news.ycombinator.com/item?id=5508225\n'
echo
'Ahoj, jak se dnes vede? 123456789' — co se stane a proč?'"''" bez použití backslash'"''" s použítím backslash;`echo -e "\n"`echo.chmod a další manipulace s právy je nutné zkoušet v e.g. lokálním adresáři — třeba /tmp.
ls -l) všech složek (pouze složek) v pracovním adresáři.skript.sh. Jakým příkazem mu nastavíte práva tak,
aby ho vlastník mohl číst a spouštět, členové skupiny ho mohli upravovat a číst a ostatní jen spouštět?
Vyjádřete to jak v textové, tak v osmičkové (číselné) notaci (tzn, 2 ekvivalentní příkazy).
old_file na 11.3.1993 15:04.command [OPTION]... [FILE]...
man a uncle Google.
stdin, stdout, stderr) jako se soubory, operátor pipe ( seq 10 | wc -l) navazuje vstup jednoho programu na druhý.
ssh, pro windows třeba PuTTY.
man, ls, cat, echo, head, tail, seq, w, who.
Je skvělý program pro efektivní učení pomocí systému kartiček a principů Spaced Repetition a Active Recall. Je k dispozici jak online, tak pro Android, resp IOS.
Během semestru budu rozšiřovat experimentální balíček s kartičkami pro Uvod do Unixu, který si můžete importovat a učit se tak pomocí Anki. A pozor, pamatovat si věci je nástroj; programovat se člověk těžko naučí bez vlastního aktu programování a experimentování. Balíček je tak myšlen jako způsob jak si zapamatovat co dělají základní utility, ale rozhodně doporučuji si všechny věci vyzkoušet.
Ke stažení: UnixCrashcourse_21_03_2017.apkg
Feedback, opravy & rozšíření jsou vítané.
Máte-li nějaký technický problém či dotaz a nepomáhá ani přemýšlení a Google, napiště mi, nebo si se mnou domluvte konzultaci.
E-mail/Hangout: J.Moudrik@gmail.com