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 91454×
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í.