SlavaQQ

osobní zápisník

Grep a mrtvé stromy

Zveřejněno 30. 7. 2020

Program grep zobrazuje řádky ze souborů obsahující předané regulární výrazy. První verzi vytvořil Ken Thompson v Bellových laboratořích kolem roku 1974. Program se stal součástí většiny unix-like operačních systémů a ze slova grep se stalo sloveso používané podobně jako sloveso googlit. Oblíbená je fráze:

You can’t grep dead trees.

Znamenající že je jednoduší vyhledávat v digitálním obsahu než v tom vyrobeném z mrtvých stromů (papír).

Použití

Připravíme si soubor kurz.txt na kterém si možnosti grepu představíme. Pro stažení aktuálních kurzu můžete použít curl nebo si soubor stáhnout a uložit v prohlížeči z ČNB:

$> curl "https://www.cnb.cz/cs/financni-trhy/devizovy-trh/kurzy-devizoveho-trhu/kurzy-devizoveho-trhu/denni_kurz.txt" >> "kurz.txt"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   983  100   983    0     0  11099      0 --:--:-- --:--:-- --:--:-- 11298

Pro kontrolu souboru použijeme příkaz head -n 5 kurz.txt, který zobrazí prvních pět řádků:

$> head -n 5 kurz.txt
24.07.2020 #142
země|měna|množství|kód|kurz
Austrálie|dolar|1|AUD|16,040
Brazílie|real|1|BRL|4,325
Bulharsko|lev|1|BGN|13,428

Základní příkaz se skládá z názvu programu grep, hledaného výrazu a souborů, které chceme prohledat. Vypíšeme všechny řádky obsahují řetězec "koruna":

$> grep koruna kurz.txt
Dánsko|koruna|1|DKK|3,528
Island|koruna|100|ISK|16,644
Norsko|koruna|1|NOK|2,456
Švédsko|koruna|1|SEK|2,558

Hledaný výraz je definován regulárním výrazem. Pro vyhledání řádku začínajících na "B" nebo "K":

$> grep "^[BK]" kurz.txt
Brazílie|real|1|BRL|4,325
Bulharsko|lev|1|BGN|13,428
Kanada|dolar|1|CAD|16,855
Korejská republika|won|100|KRW|1,880

Příkaz můžeme rozšířit o přepínače upravující chování programu. Například přepínač -i upraví chování tak že ignoruje malá a velká písmena. Regulární výrazy je vhodné obalit do uvozovek, aby bylo jednoznačné kde výraz začíná a končí:

$> grep -i "velká británie" kurz.txt
Velká Británie|libra|1|GBP|28,867

Chceme-li zjistit počet řádků obsahující výraz, použijeme přepínač -c. Například pro zjištění kolik států má jako měnu dolar:

$> grep -c dolar kurz.txt
6

Pokud naopak chceme zjistit kolik řádku neobsahuje dolar aplikujeme přepínač -v. Ten zobrazí řádky neobsahující předložený výraz. V kombinaci s přepínačem -c pak získáme počet řádků:

$> grep -cv dolar kurz.txt
29

Pro zobrazení čísel řádku slouží přepínač -n:

$> grep -n euro kurz.txt
8:EMU|euro|1|EUR|26,265

Pro zobrazení souborů obsahující hledaný výraz aplikujeme přepínač -l. Soubory s příponou txt v aktuálním adresáři obsahující výraz "měna":

$> grep -l měna *.txt
kurz.txt

Občas se hodí zobrazit více obsahu než jen řádek, kde se nachází hledaný výraz, tak zvaný kontext. K tomu slouží přepínače -A, -B nebo -C. Ty následuje číselná hodnota udávající kolik dalších řádků se má zobrazit, v případě přepínače -A za nalezeným řádkem (after), v případě -B před řádkem (before) a v obou směrech v případě -C (context):

$> grep -C 1 Polsko kurz.txt
Nový Zéland|dolar|1|NZD|15,002
Polsko|zlotý|1|PLN|5,963
Rumunsko|leu|1|RON|5,436

Grep můžeme použít i na výstup jiného příkazu. Zde je první výstup z programu grep použit pro další hledání:

$> grep -nh -e koruna -e dolar *.txt | grep -F No
24:Norsko|koruna|1|NOK|2,456
25:Nový Zéland|dolar|1|NZD|15,002

Manuál s úplným výčtem možnosti nastavení zobrazíme příkazem man grep. Můžete zkusit zjistit co dělají přepínače z předchozího příkladu. Grep ve výchozím nastavení používá základní regulární výrazy BRE. Pomocí přepínače -E se výrazy interpretují jako rozšířené regulární výrazy ERE. V případě že nechce výraz interpretovat jako regulární výraz použijeme -F. Pro operační systém Windows existuje alternativa nazvaná findstr.