Práce s textem v shellu
Budeme tady dost pracovat s 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 |#n|-tého řádku všechny zbylé.
Příklady:
#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
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 tyto polozky. 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ží.
Příklad:
#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
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č
Příklad:
paste -d# uzivatelska_jmena uzivatelska_id
Úloha:
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]
Úloha:
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].
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
Příklad:
#seřadí /etc/passwd podle uživatelských ID (numericky)
sort -t: -k3 -n /etc/passwd
tr
Od pojmu ''translate''. Změní v řetězcích znaky.
Použití: tr [množinaZnaků] [množinaZnaků2]
Příklady:
# 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
Úloha:
Znáte 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.
join -t, -1"3" -2"1" prvniTabulka druhaTabulka
- -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 argumentu seřazeny (použijte sort)'''
Příklad:
join -t: -11 -24 sortedPasswd sortedGroup
Úloha (na cut, paste):
Vstup je řádka: 0 1 2 3 4 5 6 7 8 9 A B C D E F
Výstupem by měla být matice s posouváním (každý řádek o jednu posunutější):
=> 1 2 3 0
6 7 4 5
A B C 9
C D E F
Jde opravdu jen o tenhle vstup.
Pro usnadnění použijte více scriptů, které se budou volat navzájem.