Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

vyuka:prace_s_textem [2016/10/19 16:34] (aktuální)
admin vytvořeno
Řádek 1: Řádek 1:
 +====== Práce s textem v shellu ======
 +Budeme tady dost pracovat s [[vyuka:​konfiguracni_soubory|konfiguračními soubory /etc/passwd a /​etc/​group]]
 +
 +
 +=====head=====
 +Zobrazuje '''​prvních'''​ #n řádků ze souboru. Defaultně je #n 10, dá se nastavit parametrem -n. Tento parametr se dá nastavit i záporně - pak zobrazí vše krom |#n| posledních řádků.
 +
 +=====tail=====
 +Zobrazí '''​posledních'''​ #n řádků ze souboru. Opět parametr -n, dá se nastavit i záporně - pak zobrazí od #ntého řádku všechny zbylé.
 +
 +<code bash>
 +#zobrazí prvních 5 řádek z /etc/group
 +head -n 5 /​etc/​group  ​
 +
 +#zobrazí z /etc/passwd vše krom posledních tří řádek
 +head -n -3 /​etc/​passwd ​
 + 
 +#zobrazí poslední 20 záznamů ze systémového logu
 +tail -n -20 /​var/​log/​messages
 +</​code>​
 +
 +----
 +=====cut=====
 +Rozřeže data podle zadaného separátoru,​ zobrazí pouze zadané položky.
 +Jiné použití - řeže po jednotlivých znacích.
 +Parametry:
 +  * ''​-d[znak]''​ - oddělovač polí
 +  * ''​-f1,​3''​ - vypsat pouze tato pole. Lze zadat jednu položku (''​4''​),​ seznam(''​1,​3''​),​ interval(''​1-5''​)
 +  * ''​-b2-5''​ - vypsat pouze tyto bajty(znaky). Pokud je tento parametr zadán, na ''​-d''​ nezáleží.
 +            ​
 +<code bash>
 +#zobrazí z /etc/passwd pouze přihlašovací jména společně s ID 
 +cat /etc/passwd | cut -d: -f1,3
 +
 +#zobrazí měsíc z takto formátovaného data
 +echo "​2010-05-31 12:54" | cut -b6-7
 +</​code>​
 +
 +----
 +===== paste =====
 +Slepí dva nebo více souborů (jedno z toho může být standardní vstup - parametr pomlčka) zadaným spojovačem
 +  * ''​-d[znak]''​ - delimiter - spojovač
 +
 +<code bash>
 +paste -d: uzivatelska_jmena uzivatelska_id
 +</​code>​
 +                  ​
 +
 +====Úloha 1====
 +<​code>​
 +Chci /etc/group dvakrát - tj aby namísto ​
 +[groupname]:​[password]:​[GID]:​[user_list]
 +bylo
 +[groupname]:​[password]:​[GID]:​[user_list]:​[groupname]:​[password]:​[GID]:​[user_list]
 +</​code>​
 +
 +====Úloha 2====
 +<​code>​
 +Pomocí ''​cut''​ vypište do jednoho souboru seznam loginů z /​etc/​passwd,​ do druhého souboru uživatelská ID. Poté je slepte pomocí ''​paste'',​ tak, aby byl výsledek ve formátu [ID]#​[login].
 +</​code>​
 +
 +=====sort=====
 +  * ''​-t[znak]''​ - field separator - oddělovač jednotlivých polí
 +  * ''​-k[seznam čísel nebo intervalů]''​ - které položky použít pro třídění
 +  * ''​-n''​ - třídit numericky
 +  * ''​-r''​ - obrátit
 +  * ''​-c''​ - netřídit, jen zkontrolovat zda je setříděno
 +
 +
 +<code bash>
 +#seřadí /etc/passwd podle uživatelských ID (numericky)
 +sort -t: -k3 -n /etc/passwd
 +</​code>​
 +
 +
 +===== tr =====
 +Od pojmu ''​translate''​. Změní v řetězcích znaky.
 +Základní použití: ''​tr [množinaZnaků] [množinaZnaků2]''​
 +====Přepínače====
 +  * ''​-d''​ //(pouze jedna množina)// - smaže zadané znaky z textu
 +  * ''​-s''​ //(pouze jedna množina)// - vícenásobné výskyty znaků změní na jedny
 +
 +====Příklady====
 +<code bash>
 +# Změní v passwd oddělující dvojtečky na dvoukříže
 +cat /etc/passwd | tr : "#"​
 +
 +# Ve vstupu změní velká písmenka na malá
 +echo "Ahoj Svete" | tr A-Z a-z
 +#>ahoj svete
 +
 +# Odstrani z textu samohlasky
 +echo "Ahoj svete" | tr -d aeiouy
 +#>hj svt
 +
 +# Vymaže z textu dvojité mezery
 +echo "​Ahoj ​ svete    jak se    mas?" | tr -s " "
 +#>Ahoj svete jak se mas?
 +</​code> ​     ​
 +
 +====Úloha====
 +Znáte [[http://​cs.wikipedia.org/​wiki/​Caesarova_%C5%A1ifra|Caesarovu šifru]]? Znamená to posunutí písmenek v abecedě o nějaký počet písmen. Například při posunutí 3 se z "​ahoj"​ stane "​dkrm"​.
 +
 +Vytvořte pomocí příkazu ''​tr''​ dva scripty: Jeden bude šifrovat (o tři doprava), druhý bude rozšifrovávat (o tři doleva). Ve vstupu mohou být velká písmena, avšak diakritiku zanedbejme.
 +
 +----
 +=====join=====
 +Velmi silný nástroj, jenž spojuje data podle zadaných položek.
 +Příkaz JOIN najdete i v SQL databázích.
 +Například:​ Máte jednu tabulku (pro nás soubor s nějakými oddělovači),​ ve které je:
 +> ''​[jméno],​[id],​[ID primární skupiny]''​
 +a druhou tabulku, ve které je
 +> ''​[ID skupiny],​[název skupiny]''​
 +a chceme vypsat řádky, kde budou jména i názvy primární skupiny
 +
 +Použijeme join - budeme spojovat přes ''​[ID primární skupiny]''​ z první tabulky a ''​[ID skupiny]''​ z druhé. U nás požadovaných dat se tyto dvě položky budou rovnat.
 +<code bash>
 +join -t, -1"​3"​ -2"​1"​ prvniTabulka druhaTabulka
 +</​code>​
 +
 +  * ''​-t''​ je parametr, kterému jsme dali separátor (čárku ,)
 +  * ''​-1''​ je parametr, kterému se dá číslo pole z první tabulky (3)
 +  * ''​-2''​ je parametr, kterému se dá číslo pole z druhé tabulky (2) 
 +
 +**Pozor: vstupní tabulky musí být podle spojovaného sloupce seřazeny (použijte sort)**
 +
 +<code bash>
 +join -t: -11 -24 sortedPasswd sortedGroup
 +</​code>​
 +                 
 +---- 
 +=====Odkazy=====
 +  * [[http://​www.abclinuxu.cz/​clanky/​navody/​unixove-nastroje-7-tr-cut-sort-a-uniq]] ​
 +  * [[http://​www.faqs.org/​docs/​abs/​HTML/​textproc.html]]
 +  * [[http://​www.watsys.unh.edu/​Darlene/​TechToolsFiles/​LammersUNIXDemo/​UNIX_Intro.html]]  ​
  
Nahoru