Unix Utils
Linux v příkazech - čtení a zpracování textu
Výpis textu, hledání řetězců v textu a jejich případná
záměna, třídění a základní operace s textem bez použití textového
editoru, utility pro práci s textem.
1.12.2004 10:00 | o.k. | přečteno 13394×
Tento díl bude v porovnání s ostatními trochu odlehčenější, ale i tak není dobré příkazy na práci s textem v Linuxu podceňovat, protože drtivá většina konfiguračních souborů v Linuxu je textová a pro efektivní práci s nimi je zapotřebí zvolit pro dané zpracování textu ten nejvhodnější nástroj.
Pro čtení textových souborů v Linuxu slouží příkaz more
či less. Tato dvojice příkazů vyvolává od nepaměti spoustu
slovních soubojů, flamewar chcete-li, stejně tak jako třeba programy
vim a emacs či zavaděče Linuxu
lilo a grub a mohl bych jmenovat ještě
spoustu dalších, ale nebudu, protože to je zbytečné tlachání o
ničem.
Pravdou je, že se dříve možná více používal program
less (a možná je tomu tak dodnes), který toho uměl i přes
svůj název více než program more. Hlavní důvod byl
především ten, že uměl ve výpisu textu scrollovat nejen směrem od
začátku souboru ke konci, ale bylo možné se vrátit i na předchozí, již
odscrollované stránky. Toto již delší dobu příkaz more
samozřejmě umožňuje taky.
Oba příkazy fungují tak, že při načtení daného souboru vypíší na
monitor právě jednu obrazovku (stránku chcete-li) a čekají na interakci
od uživatele, až dá pokyn (klávesou SPACE - mezerníkem) pro přesun na
další stránku. Takto si můžeme pohodlně přečíst jakkoliv dlouhý textový
dokument, třeba nějaké howto. Pokud se chceme v textu vrátit o stránku
zpět, tak jednoduše stiskneme klávesu "b" (jako back).
Pokud chceme v textu vyhledat nějaké klíčové slovo, tak stiskneme
klávesu "/" a napíšeme dané slovo. Pro opětovné
vyhledávání daného slova nám stačí stisknout klávesu "n"
nebo klávesu "." (platí pouze pro příkaz
more), která zopakuje poslední zadaný příkaz.
Program less má dole stavový řádek v němž vypisuje
název právě otevřeného souboru, právě zobrazené řádky z celkového počtu
a procentuální ukazatel udávající současnou polohu v daném souboru.
Program more vypisuje ve stavovém řádku pouze
procentuální údaj o poloze v souboru. Daný řádek na kterém se nacházíme
(řádek na konci výpisu - tedy ten úplně dole) vypíše po stisku klávesy
"=".
Program more se sám automaticky ukončí při
odscrollování textu až na konec souboru nebo jej můžeme ukončit
klávesou "q", kterou ukončujeme i program
less.
Dalším užitečným příkazem u obou programů je příkaz
"v", který nám na daném řádku spustí editor
vi (či jiný máme-li jej přenastaven v proměnné prostředí)
a umožní tak daný soubor editovat.
Kouknete-li se do manuálových stránek obou příkazů, tak zjistíte, že
příkaz less má podstatně více možností. Já jsem zvyklý na
používání příkazu more, ale občas využiji i příkaz
less, protože se podstatně lépe chová při výpisu textového
souboru ve kterém jsou místy nějaká binární data a dokáže číst i
binární soubory. Příkaz less tato binární data vypíše,
zatímco more je nevypíše, pokud zjistí, že se jedná čistě
o binární soubor a v případě textového souboru s částí binárních dat
jej vypíše, samozřejmě v podobě rozsypaného čaje, což občas rozhodí i
terminál (příkaz reset v daném terminálu vše spolehlivě
napraví, POZOR - nemyslím tím reset celého počítače - ten nechme pro
uživatele Windows :-) )
No a aby toho nebylo málo, tak existuje ještě příkaz
most, který má obdobné i když trochu omezenější vlastnosti
jako výše dva uvedené příkazy.
Dalším příkazem pro čtení textu je příkaz cat, který
však vypíše kompletně celý text ze souboru a ukončí se. Tento příkaz
čte daný text po řádcích a lze jej s výhodou použít i pro spojování
souborů. Příkaz cat se také dá využít pro zápis textu do
souboru nebo na připsání textu na konec již existujícího souboru.
cat > soubor.txt plechovka linux brambora auto tux trolejbus auto brambory CTRL-c
cat soubor1 soubor2 soubor3 > vysledny_soubor
Bratříčkem příkazu cat je příkaz tac,
který funguje úplně stejně akorát s tím rozdílem, že daný soubor
vypisuje po řádcích od jeho konce do počátku.
tac soubor.txt brambory auto trolejbus tux auto brambora linux plechovka
Příkaz head vypisuje prvních n řádků ze začátku daného
souboru. Defaultně, bez parametru vypíše prvních 10 řádků. Pokud chceme
vypsat více řádků, například prvních 25 řádků, spustíme jej
následovně
head - 25 /etc/services
nebo
head -c 25 /etc/services
pro vypsání prvních 25 znaků.
Příkaz tail je opět bratříčkem příkazu
head s tím rozdílem, že provádí výpis posledních n řádků z
daného souboru. U příkazu tail nemohu nezmínit jeho volbu
-f, při níž příkaz stále vypisuje posledních n řádků, tzn.
po přečtení n řádků ze souboru se neukončí a vypisuje dále nově
příchozí data. Toto je velice užitečná volba pro čtení logů, kdy vidíme
i nově příchozí záznamy, které jsou do logu zapsány při výskytu nějaké
události.
tail -f /var/log/messages
Dalším příkazem, který již tolik nesouvisí s čtením textu, ale spíše
s jeho zpracováním je příkaz sort a slouží k třídění
textu. Samotné třídění se řídí pravidly danými nastavením proměnné
prostředí LC_COLLATE, tzn. pokud vám tato pravidla třídění
nevyhovují, můžete si je pomocí níže uvedeného příkazu změnit na
cokoliv jiného.
export LC_COLLATE=POSIX
sort soubor.txt auto auto brambora brambory linux plechovka trolejbus tux
Pokud chceme mít na výstupu zároveň i unikátní jména (tzn. žádná
položka se nebude opakovat jako v našem případě položka "auto") tak
použijeme volbu -u nebo můžeme použít příkaz
uniq.
Níže uvedený příklad nám srovná výpis souborů a adresářů v adresáři
/etc podle velikosti a to od největšího po nejmenší - je
to analogie příkazu ls -lS.
ls -l /etc | sort +4nr
Na vysvětlenou: volba +4 říká příkazu
sort, že má třídit podle čtvrtého sloupce, volba
n říká, že třídění má být numerické (tedy podle čísel) a
volba r je třídění reverzní - obrácené.
Příkaz pro vyhledání klíčových slov v textu se nazývá
grep (lze také použít jemu podobné varianty jako například
fgrep, egrep). Následující příklad vše
objasní.
grep brambora soubor.txt brambora
V praxi jej lze s výhodou využít kromě prohledávání souborů a
hledání klíčových slov i například k výpisu platných
(nezakomentovaných) voleb konfiguračních souborů, či při kontrole
(md5sum) velkého počtu souborů, což ukazují následující
příklady. Možností využití programu grep je samozřejmě
nepřeberné množství.
grep -v \# /etc/inetd.conf md5sum -c MD5SUM | grep -v OK
Kdo z vás si myslel, že tímto naše hrátky s textem skončí, tak se mýlil, teď přijde teprve to pravé ořechové - příkazy, které nejsou tolik známé, ale o to více se můžou hodit.
Příkazy konvertující tabulátory na daný počet mezer a naopak, jedná
se o příkazy expand a unexpand.
Následující příkaz s názvem cut slouží k extrahování
polí z daného souboru či výpisu a je to nepostradatelný pomocník při
zpracování výstupů z programů. Jeho nejdůležitější volbou je volba
-d (delimiter - oddělovací znak) a volba -f
(field specifier - určení polí, která se mají vypisovat). Více bude
patrné z názorných příkladů, v prvním příkladu se pomocí
cut vypíší ze souboru /etc/mtab všechna
připojená zařízení a adresář jejich připojení a v druhém příkladu se
vypíší ze souboru /etc/passwd všichni uživatelé v systému
a jejich UID.
cat /etc/mtab | cut -d ' ' -f1,2 cut -d: -f1,3 /etc/passwd
Další příkaz pro zpracování textu, příkaz paste
umožňuje spojovat více souborů do jednoho a to tak, že spojuje soubory
do sloupců.
Vytvořme si pro názornost následující dva soubory
cat > soubor.txt plechovka linux brambora auto tux trolejbus auto brambory CTRL-c
cat > soubor2.txt rezava bajecny syrova ojete plysovy cerveny nove shnile CTRL-c
Výsledek našeho snažení za přispění příkazu paste bude
následující
paste soubor2.txt soubor.txt rezava plechovka bajecny linux syrova brambora ojete auto plysovy tux cerveny trolejbus nove auto shnile brambory
Příbuzným výše uvedenému příkazu je příkaz join, který
umí spojit dva soubory (na rozdíl od výše uvedeného, který dokáže
spojovat nespočetné množství souborů do jednoho) a vytvořit tak
jednoduchou verzi relační databáze (samozřejmě bráno s velkou
nadsázkou). Jak to funguje - každý soubor obsahuje v prvním sloupci
klíč (obvykle číselná hodnota) a podle tohoto klíče program
join spáruje dané položky k sobě. Tyto dvousloupcové
soubory můžeme vytvořit právě za pomoci příkazu paste.
data1.txt --------- 1 pivo 2 kofola 3 caj 4 mliko
data2.txt --------- 1 25Kc 2 15Kc 3 20Kc 4 10Kc
join data1.txt data2.txt 1 pivo 25Kc 2 kofola 15Kc 3 caj 20Kc 4 mliko 10Kc
Když už jsem nakousl číslování, tak samozřejmě nemůžu nezmínit
program nl, který provádí číslování řádků daného souboru a
je vhodný například pro číslování řádků zdrojového kódu.
Následující dva příkazy fold a fmt slouží
k formátování textu na danou šířku. Zatímco příkaz fold
nám daný text naformátuje na danou šířku, tzn. že případné slovo bez
problémů uprostřed rozdělí, příkaz fmt zohledňuje daná
slova a citlivě text rozděluje, takže je vhodný pro formátování textu
na danou šířku - defaultně je nastaven na šířku 75 znaků na řádku.
Dalším z formátovacích příkazů je příkaz column, který
slouží k formátování textu do úhledných sloupců.
(printf "PERMISSIONS LINKS OWNER GROUP SIZE MONTH DAY \ HH:MM NAME\n" ; ls -l /etc) | column -t
Příkaz, který naopak vyjímá sloupec dané šířky z výpisu či souboru
se nazývá colrm.
ls -l /etc/ | colrm 1 10
Jedním z posledních příkazů, které si v tomto díle probereme je
příkaz tr sloužící ke změně/záměně znaků. Nejčastější
využití má v záměně všech znaků za malá či naopak za velká písmena nebo
při převodu DOSových konců řádků na Linuxové (tedy vyjmutí znaků CR).
Příkaz tr by se dal považovat za hodně odlehčenou variantu
programu sed nebo awk, které také spadají do
tohoto dílu, ale pro jejich náročnost se jim budeme věnovat až v
některém z dalších dílů linuxových příkazů. U příkazu tr
je důležité si dát pozor na to, že dané hranaté závorky je třeba
správně uvozovat, aby je neexpandoval daný shell.
tr '[:lower:]' '[:upper:]' < soubor.txt tr -d '\015' < soubor.txt
Pomocí příkazu tr se také dají hrát zajímavé šifrovací
hry, kdy daná písmena zaměníme za jiná.
cat soubor.txt | tr "A-Z" "TOSHRKPNELUDCWFYIGJAMQBVZX" AMV TA BFGU!
Všem je doufám jasné, co jsem napsal :-)
Posledním příkazem, který patří spíše do kategorie informativních je příkaz wc (ten si díky svému názvu jistě každý dobře zapamatuje). Slouží k výpisu počtu řádků, slov a písmen (znaků včetně mezer). V praxi se často využívá pro počítání, například
wc soubor.txt
8 8 59 soubor.txt
nebo
ls /etc | wc -l
169
což vypíše počet řádků, tedy souborů a adresářů v adresáři
/etc.
Doufám, že vás tento poměrně těžkopádný výklad příkazů pro zpracování textu nějak neodradil od poznávání příkazové řádky a že jste si v něm nalezli pár příkazů, které vám budou ulehčovat vaši práci. Práce s textem v příkazové řádce je každopádně mnohem efektivnější než práce s textem v grafickém prostředí.