5

Prohlížení textových souborů

Obecná práce s textem v příkazové řádce

Prozatím jsme pracovali s adresářovou strukturou a prázdnými soubory. Teď se podíváme jak prozkoumat obsah souboru.

Stažení a prohlížení ukázkového souboru

Jako ukázkový soubor si stáhneme zdrojový kód textu předchozí lekce ve formátu Markdown. Budeme na tento soubor nahlížet jako na obyčejný textový soubor.

$ wget https://raw.githubusercontent.com/ZelenyMartin/uvod-do-linuxu/master/prikazova-radka/specifikace-cesty/lesson.md

Příkaz pro vypsání obsahu souboru se jmenuje cat.

$ cat lesson.md

Název příkazu cat nemá nic společného s kočkou. Jedná se o zkratku anglického výrazu concatenate, což znamená pospojovat nebo zřetězit. Příkaz cat umí nejen vypsat jeden soubor, ale všechny soubory, které jsou mu předány jako parametry příkazové řádky.

Pro ukázku k čemu je to dobré si stáhněme další testovací soubory.

$ wget https://kodim.cz/czechitas/uvod-do-linuxu/prikazova-radka/prohlizeni-textovych-souboru/assets/data1.txt
$ wget https://kodim.cz/czechitas/uvod-do-linuxu/prikazova-radka/prohlizeni-textovych-souboru/assets/data2.txt

Jednotlivě si zobrazme obsahy souborů.

$ cat data1.txt
31
15
86
10
82
24
$ cat data2.txt
69
21
13
20
24
71

Dohromady si soubory vypíšeme.

$ cat data1.txt data2.txt

S předchozí kapitoly můžeme použít i zástupné znaky.

$ cat data*

Pomocí znaku “větší než”, který si nyní představme jako šipku, můžeme výpis přesměrovat do nového souboru, který si pojmenujeme např. data_all.txt.

POZOR! Pokud by náhodou soubor data_all.txt už existoval, bude jeho obsah následujícím příkazem nemilosrdně bez jakékoliv ujišťujícího dotazu přepsán.

$ cat data1.txt data2.txt > data_all.txt

Pokud bychom chtěli původní obsah souboru zachovat a zapsat nový text až na konec, musíme použít dvojitou šipku >>.

Přehlednější zobrazení souboru

Vrátíme-li se k příkladu vypsání obsahu souboru lesson.md, uvidíme, že pokud je počet řádků souboru větší než výška našeho terminálu, musím na začátek souboru scrollovat kolečkem. Někdy je tento způsob dost nepřehledný, protože se nám začátek textového souboru vizuálně smísí s předchozím textem v našem terminálu a nevidíme pořádně, kde soubor vlastně začíná.

Abychom si pomohli, představíme si další příkazy pro prohlížení souborů.

$ head lesson.md

Příkaz head vypíše začátek souboru. Ve výchozím nastavení vypisuje prvních 10 řádků souboru. Toto je možné upravit parametrem -n.

$ head -n 5 lesson.md

Podobně funguje příkaz tail, který naopak vypisuje poslední řádky souboru.

$ tail lesson.md
$ tail -n 5 lesson.md

Posledním hezkým nástrojem pro zobrazení souboru je program less. Tento příkaz, podobně jako program man, funguje interaktivně a na celý terminál nám zobrazí obsah souboru. Také nám umožní souborem procházet pomocí šipky nahoru a dolu a kláves Home a End. Neméně důležitou funkcionalitou je interaktivní vyhledávání, které spustíme klávesou lomítko /, na další výskyt vyhledávaného textu se posuneme klávesou n a na předchozí výskyt velkým N. Program less ukončíme opět klávesou q.

$ less lesson.md

Další nejzákladnější příkazy nad soubory

Umíme už vypsat celý soubor pomocí příkazu cat a umíme vypsat začátek pomocí head a konec díky tail. Nyní si ukážeme jak textový soubor prohledávat.

K tomu nám poslouží program grep.

grep

$ grep <co hledávám> <název souboru>

Grep budeme používat s dvěma hlavními parametry, a to jako první parametr hledaný řetězec a jako druhý parametr bude název souboru, který se má prohledávat. Program grep neumí jen prosté vyhledávání řetězců v textovém souboru. Jeho hlavní síla tkví ve využití regulárních výrazů. Jedná se však o pokročilou část, kterou nebudeme v úvodním kurzu probírat a zájemce odkážu na kapitolu o využití regulární výrazů v Pythonu.

Při ukázce použití programu grep se vrátíme ke zdrojovému kódu lekce ve formátu Markdown. Markdown formátování kapitol začíná znakem hash # (a nadpis druhé úrovně je vyjádřen dvěma mřížkami ##). Pozor: hledaný text ## zde musíme uzavřít do uvozovek (jedno jestli jednoduchých nebo dvojitých). V linuxovém shellu je znak # považován za začátek komentáře, a tak by se nám zbytek příkazu ignoroval. Komentáře se tedy zapisují stejně jako např. v jazyce Python.

$ grep '##' lesson.md
## Specifikace cesty
## Vyhledávání souborů
## Stažení a rozbalení pracovních dat
## Příklady použití příkazu find

Program grep má také mnoho užitečných přepínačů. Např. grep -i ignoruje velikost písmen v hledaném textu nebo grep -v invertuje výběr (vypíše naopak řádky, které neobsahují hledaný výraz).

Cvičení

1

Spojování CSV souborů

zapni hlavu

Stáhněte si v příkazové řádce do pracovního adresáře následující soubory:

https://kodim.cz/czechitas/uvod-do-linuxu/prikazova-radka/prohlizeni-textovych-souboru/assets/u202.csv
https://kodim.cz/czechitas/uvod-do-linuxu/prikazova-radka/prohlizeni-textovych-souboru/assets/u203.csv
https://kodim.cz/czechitas/uvod-do-linuxu/prikazova-radka/prohlizeni-textovych-souboru/assets/u302.csv

Soubory spojte do jednoho souboru. Bohužel ale není možné jednoduše použít cat u* - v datech by vám vadila hlavička z každého CSV. Ve výsledném souboru mějte hlavičku pouze jednou na prvním řádku. Můžete využívat různé dočasné pracovní soubory.

wc

Druhý příkaz, který si ukážeme je program wc. Za vtipnou zkratkou se skrývá Word Count. Zavoláme-li příkaz s názvem souboru, vypíší se nám 3 čísla. V manuálové stránce zjistíme, že se jedná o počet řádků, slov a velikost souboru v bytech. Velikost souboru ukazuje i příkaz ls -l. Místo trojice čísel je však vhodnější znát jen jednu konkrétní hodnotu. Nejčastěji se příkaz používá jako wc -l, které vypíše počet řádků.

$ wc lesson.md
  88  414 3163 lesson.md
$ wc -l lesson.md
88 lesson.md

Nejdůležitější znak v terminálu je |

Roura pipe nebo-li svislítko je znak, který máte na anglické klávesnici vlevo nebo nad klávesou Enter. Upřímně si myslím, že roura se používá v linuxovém terminálu tak často, že stojí za to se přeučit na anglickou klávesnici. Tento znak se v shellu používá na tajemnou konstrukci, která se popisuje jako “přesměrování standardního výstupu jednoho programu na standardní vstup druhého programu”.

Většina příkazů, která akceptuje jako svůj parametr název souboru, totiž umí načítat text i ze standardního vstupu, který může vypsat jiný program na standardní výstup.

Příklad vydá za tisíc slov

$ grep '##' lesson.md | wc -l
4

Příkaz grep '##' lesson.md samotný by nám vypsal v tomto případě 4 řádky. Pokud tyto řádky pošleme spočítat příkazem wc -l, vypíše se nám číslo 4.

Zkusme to zkombinovat s tím co už známe. Vypiš první kapitolu:

$ grep '##' lesson.md | head -n 1
## Specifikace cesty

Vypiš poslední kapitolu:

$ grep '##' lesson.md | tail -n 1
## Příklady použití příkazu find

Kolik se v adresáři nachází souborů s příponou .csv?

$ ls *.csv | wc -l

V posledním případě je třeba znát, že některé příkazy, jako je např. ls umí poznat, jestli se jejich standardní výstup vypisuje na terminál nebo do roury. Podle toho upraví své chování.

Vyzkoušejte si např.

$ ls
$ ls | cat