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 othelloNá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