Try   HackMD

Ú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:

$ 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:

  1. Vypiš všechna místa konání Pyv (stačí mít na každém řádku identifikátor jako artbar).
  2. 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.

  1. 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.

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:

>>> 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:

$ echo Ahoj | obrat
ɾoɥ∀

Jednotlivé řádky by měl program zpracovávat samostatně:

$ 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:

$ obrat pozdrav.txt
'ɾoɥ∀
¡sǝᴉpɐ˥ʎԀ
$ obrat pozdrav.txt pozdrav.txt
'ɾoɥ∀
¡sǝᴉpɐ˥ʎԀ
'ɾoɥ∀
¡sǝᴉpɐ˥ʎԀ

Argument - znamená standardní vstup.

$ 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.

$ 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.

$ 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)