# Uvod do UNIXu, 3. cviceni, 2005-03-09
#
# $DevNullCZ: cviceni-03.reseni.txt,v 1.2 2005/04/01 08:43:48 jp Exp $
#

Postupne provadejte dane priklady. Krome prvnich prikladu, ktere
jsou spise na uvedomneni si nekterych zalezitosti, se reseni
vetsinou sklada z 2-3 pajp spojenych za sebou krome prikladu (15),
ktery je o neco malo tezsi.

Vsechny priklady provadejte na mail.kolej.mff.cuni.cz, pripadne na
jinem stroji s FreeBSD.

---

(1) zkontrolujte pristupova prava /tmp/pechanec2 a pristupova prava
souboru v nem vytvorenych. Overte si, ze nejste vlastniky danych
souboru a zjistete, zda muzete nektery z techto souboru smazat. Proc
tomu tak je/neni?

(2) v adresari /tmp/pechanec zkuste smazat podadresar 'test'. Proc
to ted nelze? Hint: 'man sticky', 'man chmod' a poradne se podivejte
na prava /tmp/pechanec a /tmp/pechanec2

(3) v /tmp si vytvorte adresar sveho jmena, v nem soubor 'test',
ktery ma prava '--x--xr--' a do tohoto souboru vlozte prikaz,
kterym jste dosahli nastaveni techto prav. Nepouzivejte editor !!!

Hint: echo, >

(4) overte v manu pro chmod, proc 'chmod = xxx' nastavi prava
souboru 'xxx' na ---------

DOMACI UKOL: podivejte se do 'man chmod' na nastaveni prav pomoci
absolutniho modu (oktalovy - 0400, 0100, ...)

(5) ve tom svem tmp adresari si vytvorte adresar 'foo', v nem
soubory '1.foo' a '2.foo' a adresar 'bar', v adresari 'bar' pak
jeste soubory 'a.bar' a 'b.bar'. Kdyz si date 'ls -R foo', musi
vam to ukazat vypis podobny tomuto (prava ted igorujte):

[KOLEJ-MAIL:pechanec]/tmp/pechanec$ ls -lR foo
total 3
-rw-------  1 pechanec  wheel    6 Mar  9 10:57 1.foo
-rw-------  1 pechanec  wheel    6 Mar  9 10:57 2.foo
drwx------  2 pechanec  wheel  512 Mar  9 10:58 bar/

foo/bar:
total 2
-rw-------  1 pechanec  wheel  6 Mar  9 10:58 a.bar
-rw-------  1 pechanec  wheel  6 Mar  9 10:58 b.bar

Ted pro sebe (majitele) odstrante u adresare 'foo' pravo cteni, u
adresare 'bar' pravo 'x'. Zkuste nasledujici a zkuste si uvedomit,
proc tomu tak je:

## ls zjistuje informace z inodu souboru foo/bar/*, coz neni povoleno
ls foo/bar
## pouze ctu adresar bar, coz je ok
echo foo/bar/*
## pouze me zajimaji presnejsi informace o adresari 'bar', coz je ok,
## protoze 'bar' je pro me readable 
ls -ld foo/bar
## sice nemuzu cist 'foo', ale protoze vim konkretni soubor v nem a
## ten soubor me nijak neomezuje, funguje to
ls -l foo/1.foo
## funguje; pokud a.bar neni prazdny, opravdu se vypise
cat foo/bar/a.bar
## nefunguje, protoze 'bar' neni prohledavatelny (i kdyz je citelny
## (readable) !)
ls foo/bar/b.bar

(toto jeste blize na cviceni vysvetlim)

(6) vypiste 1. 10 radku /etc/passwd tak, ze vypisujete radky az od
2. znaku vcetne, tj. ve vystupu budou i tyto radky:

oot:*:0:0:Charlie &:/root:/usr/local/bin/bash
oor:*:0:0:Bourne-again Superuser:/root:/usr/local/bin/bash

## head -10 /etc/passwd | cut -c 2-

(7) setridte soubor /etc/group podle cisla GID. Dejte pozor na to,
ze tridite cisla. 1., 3. a 4. radek tedy vypadaji takto:

nobody:*:-1:
<zde umyslne chybi skupina wheel>
daemon:*:1:daemon
kmem:*:2:root

## grep -v ^# /etc/group | sort -nk 3 -t:

UKAZTE MI VYSLEDEK.

(8) vypiste nejvyssi UID cislo z /etc/passwd. Ma vyjit 65534

## grep -v ^# /etc/passwd | cut -f3 -d: | sort -rn | head -1

UKAZTE MI VYSLEDEK.

(9) vypiste radek z nejvyssim UID cislem v /etc/passwd

## grep -v ^# /etc/passwd | sort -t: -rn -k3 | head

(10) pomoci prikazu 'tr' nahradte vsechna mala pismena v /etc/passwd
na velka; pouzijte tridy znaku (,,classes''). Viz 'man tr'

## cat /etc/passwd | tr '[:lower:]' '[:upper:]'

Uvedomte si (viz 'man tr'), ze prikazu 'tr' nelze zadat jmeno souboru
jako parametr!

(11) z /etc/passwd pomoci prikazu 'tr' vymazte vsechny vyskyty
znaku ':'

## cat /etc/passwd | tr -d ':' 

(12) nahradte v /etc/group znaky noveho radku mezerou (znak nove
radky se zapise pomoci '\n'). Vysledkem je tedy jeden dlouhy
radek, kde puvodni radky jsou spojene mezerou.

## cat /etc/group  | tr '\n' ' '

(13) pomoci 'tr' zmente vsechny znaky, ktere nejsou 'a', na 'X'

hint: 'man tr' a najdete si 'Complement'; hledani funguje pomoci
/co_chci_najit<ENTER>

note: uvedomte si, ze zmena na X plati i pro znaky konce radku, tedy
vysledkem je jeden dlouhy radek !!!

## cat /etc/passwd | tr -c 'a' 'X'

(14) jako (13), ale nasobne vyskyty znaku 'X' za sebou ve vysledku
nahradte jedinym znakem X (hint: man tr). Vystup tedy musi byt
takovyto:

XaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaX  ....atd

## cat /etc/passwd | tr -sc 'a' 'X'

(15) spocitejte, kolik ruznych slov je obsazenych v souboru
'/home/pechanec/rfc/rfc791.txt'.

hint: vsechny znaky, ktera nejsou pismena a-Z, nahradte znakem
nove radky. Vysledek setridte, zruste duplicitni radky (=slova)
pomoci prikazu 'uniq'. Spoctete vysledny vystup. Vysledek ma vyjit
1448 ruznych slov. Pokud navic igorujete velka mala pismena (=
prevedete vsechno napr. na mala), vyjde vam 1222 ruznych slov.

UKAZTE MI VYSLEDEK.

## cat /home/pechanec/rfc/rfc791.txt | tr -cs '[:alpha:]' '\n' | tr '[:upper:]' '[:lower:]' | sort | uniq | wc -l
##
## note: misto 'sort | uniq' je mozne pouzit i 'sort -u'
##
## NIKDY NEPOUZIVEJTE VYCTY ZNAKU POMOCI INTERVALU, POKUD VAM PUJDE
## O CELOU SKUPINU ZNAKU, ALE POUZIJTE DEFINOVANE TRIDY. TEDY POUZIJTE
## [:alpha] misto 'a-Z'. Jednim z duvodu je napriklad to, ze
## diakritika podle aktualni lokalizace systemu vam bude spis fungovat
## s tridami nez kdyz pouzijete interval; v praxi overeno a rovnez
## doporuceno primo v "man grep":
##
## "For  example,  [[:alnum:]]  means  [0-9A-Za-z],  except the latter
## form depends upon the C locale and the ASCII character encoding,
## whereas the former  is  independent  of  locale  and character
## set."

(16) rozdelte soubor /etc/passwd na soubory, z nich kazdy ma 10
radku, jeho jmeno zacina retezcem 'passwd-' a nasleduji 3 znaky,
ktere rozlisuji jednotlive split soubory.

## split -a 3 -l 10 /etc/passwd passwd-