Přesuň se do adresáře data-shell/writing, kde se nachází soubor haiku.txt
$ cat haiku.txt
The Tao that is seen
Is not the true Tao, until
You bring fresh toner.
With searching comes loss
and the presence of absence:
"My Thesis" not found.
Yesterday it worked
Today it is not working
Software is like that.
(Jsou to básničky ze soutěže časopisu Salon.)
Náš úkol je podívat se na řádky, kde se nachází slovo not.
Existuje program grep, kterému předáš hledané slovo a soubor(y) k prohledání
– a on řádky s daným slovem vypíše.
Následující příkaz tedy hledá v souboru haiku.txt řetězec not a vypíše každý řádek s tímto řetězcem:
$ grep not haiku.txt
Is not the true Tao, until
"My Thesis" not found.
Today it is not working
Příkaz grep má spoustu zajímavých přepínačů, například:
-i: Nezáleží na velikosti písmen (case insensitive).-n: Vypíše čísla řádků.-w: Hledá jen celá slova.-F: Hledá přesně zadaný řetězec (viz níže).Takhle můžeš najít všechny řádky se slovem the nebo The:
$ grep -i the haiku.txt
The Tao that is seen
Is not the true Tao, until
and the presence of absence:
"My Thesis" not found.
Jejda, tam je ale něco navíc! Jak příkazem odstraníš z výpisu řádek se slovem Thesis?
$ grep -iw the haiku.txt
The Tao that is seen
Is not the true Tao, until
and the presence of absence:
grep je velice užitečný program. Pokud pracuješ s Bashem, brzy se z něj stane tvůj nejlepší kamarád.
Pozor ale na to, co grep bere jako hledaný řetězec: je to totiž regulární výraz (angl. regular expression, regex).
Pokud hledáš jen písmenka, nenarazíš na problém, ale u znaků jako tečky, hvězdičky, otazníky apod. může být výstup jiný než očekáváš.
Zkus několik příkazů:
$ grep -i the.i haiku.txt
$ grep -i '.*' haiku.txt
$ grep -iw '.....' haiku.txt
Regulární výrazy jsou velice užitečné, ale taky jsou nad rámec tohoto kurzu
(nebo aspoň této lekce).
Zatím si tedy zapamatuj, že speciální funkce znaků můžeš vypnout pomocí
přepínače -F (aby je nezpracoval grep) a uzavřením do jednoduchých
uvozovek (aby je nezpracoval Bash).
Příkaz find je další užitečný hledací příkaz.
$ find . -name '*.txt'
./haiku.txt
./data/LittleWomen.txt
./data/two.txt
./data/one.txt
Příklad výše hledá v aktuálním adresáři (.) a všech podadresářích soubory,
které odpovídají masce *.txt.
Proč je '*.txt' v uvozovkách?
Vzpomeň si, že znak * zpracovává samotný Bash: kdybys *.txt zadala
bez uvozovek, find by dostal jako argumenty všechny soubory *.txt
z aktuálního adresáře.
Uvozovky říkají Bashi, aby příkazu find předal opravdu *.txt.
find tak může odpovídající soubory hledat sám – i v podadresářích.
Příkaz find má kromě -name spoustu jiných přepínačů.
Až je budeš potřebovat, najdeš je v manuálové stránce.
Podobného výsledku jako výše (ale bez jména adresáře) dosáhneš když zadáš:
$ ls --recursive | grep txt
haiku.txt
LittleWomen.txt
one.txt
two.txt
I bez jména adresáře se takový výstup občas hodí – třeba když chceš spočítat, kolik těch souborů je:
$ ls --recursive | grep txt | wc -l
4