Kódím.cz

Čtení na doma

Ve zbytku kapitoly uvedu další ukázky, které je možné v linuxové příkazové řádce provádět s textem.

Další možnosti příkazů head a tail

Vraťme se zpět k filtrování řádků. Víme, že k tomu můžeme použít program grep, pokud chceme vyhledat nějaký výskyt řetězce na řádku. Pokud chceme filtrovat podle čísla řádku, můžeme využít head nebo tail. Doposud jsme specifikovali, kolik chceme nechat řádků za začátku souboru nebo na konci souboru. Můžeme však i opačně říct, že chceme smazat určitý počet řádků z konce (head a číslo s prefixem -) nebo vypsat vše od určitého řádku do konce (tail a číslo s prefixem +).

Ekvivalentem k příkazu sed '1d' pro smazání hlavičky CSV souboru je také tail -n +2. Tento příkaz nám říká: vypiš konec souboru od řádku 2 dál. Co to znamená a jak to funguje si ukážeme na řadě čísel:

Výpis prvního řádku

$ seq 10 | head -n 1
1

Smazání posledního řádku

$ seq 10 | head -n -1
1
2
3
4
5
6
7
8
9

Výpis posledního řádku

$ seq 10 | tail -n 1
10

Smazání prvního řádku:

$ seq 10 | tail -n +2
2
3
4
5
6
7
8
9
10

Důležité je si zapamatovat, že head vždy vypisuje začátek souboru a tail vypisuje konec souboru. Pomocí prefixů + a - lze zpřesňovat toto chování.

awk

Nejpokročilejším nástrojem, který si zde představíme, je program awk. Z doposud představených nástrojů má nejdelší manuálovou stránku. Jedná se interpret programovacího jazyka, který je určen pro práci s tabulkovými daty. Nástroje jako sed a awk už jsou pokročilejší věci, ale jejich použití pro složité problémy nemusí být vždy nejlepší volba. Dnes jdou některé úkoly řešit snadněji pomocí jazyka Python a jeho knihovny Pandas.

Výhoda awk podobně jako programu sed je však ta, že pracuje jako filtr a využívá unixový způsob práce se standardním textovým vstupem a výstupem a jeho propojení rourami. Tím se může plně integrovat se všemi ostatními nástroji, které jsme prozatím probrali.

Pro následující ukázku si vezměme sloupeček čísel a příkazů, které nám vyprodukovalo předchozí cvičení

   1383 cd
   1167 git
    786 python
    759 cat
    398 gvim
    313 vim
    209 find
    203 sudo
    187 mv
    168 ls

Tyto data jsou hezky zarovnány, aby se dobře četly, ale pokud bychom si chtěli sloupce vyříznout, tak příkaz cut zde neuspěje. Jednotlivá pole totiž nejsou oddělena přesně jedním znakem.

$ awk '{print $1}' data.txt
1383
1167
786
759
398
313
209
203
187
168
$ awk '{print $2}' data.txt
cd
git
python
cat
gvim
vim
find
sudo
mv
ls

Příklad použití jazyka awk pro počítání s daty

$ awk 'BEGIN {sum = 0} {sum += $1} END {print sum}' data.txt
5573

Vytiskni řádky pouze pro třípísmenné příkazy

$ awk 'length($2) == 3 {print $0}' data.txt
   1167 git
    759 cat
    313 vim

Číslo uvozená znakem dolar $ značí příslušné políčko v řádku (čísluje se zde od 1). $0 znamená celý řádek.

Důležité je vědět, že síla programů sed, awk (a např. i grep) vyzní až s použitím regulárních výrazů. Nevadí, pokud jste programem awk spíše zmateni. Stačí si zapamatovat, že něco takového existuje. Programovací úsilí směřujte více např. k jazyku Python.