# Úkoly – Bash II &c ## 1. Grepování yamlů Procvič si příkazy jako `ls`, `wc`, `grep` a jak je spojit dohromady. Stáhni a rozbal si tyto archivy s informacemi o komunitních akcích: kurzech/srazech PyLadies a srazech Pyvo. $ wget -O pyladies-cz.zip https://github.com/PyLadiesCZ/pyladies.cz/archive/master.zip $ unzip pyladies-cz.zip $ wget -O pyvo-data.zip https://github.com/pyvec/pyvo-data/archive/master.zip $ unzip pyvo-data.zip Data si prohlédni a zjisti, co se v nich skrývá za informace. Zvlášť doporučuju třeba soubor `pyvo-data-master/series/brno-pyvo/events/2018-10-25-casove.yaml`. Použij základní shellové příkazy (ne Python) na zodpovězení otázek níže. > YAML soubory by se správně měly číst knihovnou na YAML, aby byla zachována struktura. Ty je ale ber jako "čistý text", kde hledané informace jsou na řádcích ve tvaru `klíč: hodnota` (případně s nějakýma mezerama a/nebo pomlčkama navíc). > Odpovědi tak nemusí být 100% přesné. > > "Zakomentované" informace (začínající `#`) počítej pro jednoduchost taky. 1. Kolik bylo Pyv v Brně? * *Pro každý sraz existje soubor.* 2. Kolik bylo Pyv celkem? 3. Z kolika přednášek na Pyvech jsou videa? *(Předpokládej že každá přednáška může mít max. 1 video)* * *Videa jsou označena `video:`* 4. Kolik bylo kurzů/srazů PyLadies? * *Srazy jsou v adresáři `meetups/` a každý má jméno, `name:`* 5. (Bonusová výzva) Z kolika Pyv jsou videa? ### Nápověda Šablonami jako `adresar/*/podadresar/*` můžeš vybrat soubory z více adresářů. Příkaz `grep` má zajímavé přepínače `-l`/`-L`, `-h`/`-H` a `e`. ## 2. Uniq Příkaz `uniq` odstraní *po sobě jdoucí* duplikované řádky: ```console $ echo ' > jedna > dva > dva > tři > tři > tři > jedna > ' | uniq jedna dva tři jedna ``` Často se používá `sort | uniq`, aby se stejné řádky z celého souboru dostaly k sobě. Použij `uniq` k zodpovězení těchto otázek: 6. Vypiš všechna místa konání Pyv (stačí mít na každém řádku identifikátor jako `artbar`). 7. Přidej informaci o tom, kolikrát na kterém místě Pyvo bylo. Příkaz `uniq` má zajímavý přepínač `-c`. ### Bonusová výzva Existuje zajímavý příkaz `cut`, který má zajímavé přepínače `-d` a `-f`. 8. Jaké jsou 3 nejčastější křestní jména organizátorů/koučů/atd. PyLadies? ## 3. Vlastní příkaz Níže je funkce v Pythonu, která bere řetězec a vrátí "obrácený" řetězec: znaky jsou v něm pozpátku a nahrazené podle slovníku. Tvůj úkol je napsat příkaz pro příkazovou řádku, který bude radost použít v Bashi. Detaily níže. ```python obracena_pismena = { 'a': 'ɐ', 'b': 'q', 'c': 'ɔ', 'd': 'p', 'e': 'ǝ', 'f': 'ɟ', 'g': 'ƃ', 'h': 'ɥ', 'i': 'ᴉ', 'j': 'ɾ', 'k': 'ʞ', 'l': 'l', 'm': 'ɯ', 'n': 'u', 'o': 'o', 'p': 'd', 'q': 'b', 'r': 'ɹ', 's': 's', 't': 'ʇ', 'u': 'n', 'v': 'ʌ', 'w': 'ʍ', 'x': 'x', 'y': 'ʎ', 'z': 'z', 'A': '∀', 'B': 'B', 'C': 'Ɔ', 'D': 'D', 'E': 'Ǝ', 'F': 'Ⅎ', 'G': 'פ', 'H': 'H', 'I': 'I', 'J': 'ſ', 'K': 'ʞ', 'L': '˥', 'M': 'W', 'N': 'N', 'O': 'O', 'P': 'Ԁ', 'Q': 'Q', 'R': 'R', 'S': 'S', 'T': '┴', 'U': '∩', 'V': 'Λ', 'W': 'M', 'X': 'X', 'Y': '⅄', 'Z': 'Z', '0': '0', '1': 'Ɩ', '2': 'ᄅ', '3': 'Ɛ', '4': 'ㄣ', '5': 'ϛ', '6': '9', '7': 'ㄥ', '8': '8', '9': '6', ',': "'", '.': '˙', '?': '¿', '!': '¡', '"': '„', "'": ',', '`': ',', '(': ')', ')': '(', '[': ']', ']': '[', '{': '}', '}': '{', '<': '>', '>': '<', '&': '⅋', '_': '‾', } def obrat(text): return ''.join(obracena_pismena.get(c, c) for c in reversed(text)) ``` Příklad použití v Pythonu: ```pycon >>> obrat("Ahoj, PyLadies!") "¡sǝᴉpɐ˥ʎԀ 'ɾoɥ∀" ``` Program pro příkazovou řádku by měl být spustitelný (zařiď pomocí `chmod`). Po zkopírování do správného adresáře by měl jít spustit pomocí příkazu `obrat`. Když nedostane žádný argument, obrátí standardní vstup: ```console $ echo Ahoj | obrat ɾoɥ∀ ``` Jednotlivé řádky by měl program zpracovávat samostatně: ```console $ echo 'Ahoj,' > pozdrav.txt $ echo 'PyLadies' >> pozdrav.txt $ cat pozdrav.txt Ahoj, PyLadies $ cat pozdrav.txt | obrat 'ɾoɥ∀ ¡sǝᴉpɐ˥ʎԀ ``` Pokud `obrat` dostane argumenty, zpracuje dané soubory: ```console $ obrat pozdrav.txt 'ɾoɥ∀ ¡sǝᴉpɐ˥ʎԀ $ obrat pozdrav.txt pozdrav.txt 'ɾoɥ∀ ¡sǝᴉpɐ˥ʎԀ 'ɾoɥ∀ ¡sǝᴉpɐ˥ʎԀ ``` Argument `-` znamená standardní vstup. ```console $ echo Ahoj | obrat - ɾoɥ∀ $ echo haha | obrat pozdrav.txt - pozdrav.txt 'ɾoɥ∀ ¡sǝᴉpɐ˥ʎԀ ɐɥɐɥ 'ɾoɥ∀ ¡sǝᴉpɐ˥ʎԀ ``` Pokud dostane přepínač `--help`, vypíše krátkou nápovědu a ignoruje ostatní argumenty. Je-li použit jiný přepínač (začínající `-`) a ne `--help`, program uživateli vynadá (na chybovém výstupu), vrátí chybovou návratovou hodnotu (`exit(1)`) a ignoruje ostatní argumenty. ```console $ obrat -x Přepínač -x neexistuje, viz --help $ obrat --cislovani-radku > vystup.txt Přepínač --cislovani-radku neexistuje, viz --help $ echo $? 1 ``` Nakonec program změň tak, aby když některý znak chybí ve slovníku, vracel chybovou návratovou hodnotu `2`. Pořád ale zpracuje celý vstup. ```console $ echo Ahoj | obrat ɾoɥ∀ $ echo $? 0 $ echo Čau | obrat nɐČ $ echo $? 2 ``` ### Nápověda k Pythonu Naimportuješ-li `sys` a `os`, pak: * `sys.argv` je seznam argumentů (včetně jména programu) * `sys.stdin` je *už otevřený* soubor se std. vstupem (netřeba `with` či `close`) * Podobně `sys.stdout` je soubor se standardním výstupem (tam píše `print`) a `sys.stderr` je soubor chybovým výstupem. * `os.environ` je slovník* s proměnnýma prostředí * `exit(1)` ukončí program s danou hodnotou (* přesněji řečeno, objekt který se chová jako slovník)