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 [2023/11/15 20:54] (aktuální)
Řá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