Milan Kryl

UNIX a TCP/IP

Abych ulehčil lidem, které ještě čeká zápočtová písemka z UNIXu a TCP/IP tak jsem se rozhodl vytvořit tyto stráky, které budou obsahovat zadání nějakých příkladů a také jejich následné řešení. Samozřejmě to nebude jediné správné řešení, které je možno vymyslet, ale pokud by jste doopravdy nemohli přijít na nic, tak vám tady nabídnu jednu možnost, jak takový příklad řešit. Berte to spíš jako pár tipů pro začátek, než jako kompletní materiál ke zkoušce... :)

Cvičné příklady jsem získal ze stránek Martina Berana, který dělá cviční k této přednášce a má tam velké množství příkladů, ze kterých jsem jich několik vybral. Ale už nebudu dál zdržovat a přejdu "k věci"

1. grep, /etc/passwd
--------------------
Zadání: Vypiště všechny řádky z /etc/passwd , které NEOBSAHUJÍ uživatele - studenty. Studenta poznáte tak, že jeho login je tvaru čtyři písmena a čtyři čísla (ppppCCCC). (až budete mít, můžete ještě dodělat, aby se nevypisovali ani studenti, kteří mají login ve tvaru pět písmen, číslice a dvě písmena. (pppppCpp))

Řešení:
grep -v '^\([a-zA-Z]\)\{4\}\([0-9]\)\{4\}' /etc/passwd

(řešení doplňující otázky
grep -v '^\([a-zA-Z]\)\{4\}\([0-9]\)\{4\}' /etc/passwd | \
grep -v '^\([a-zA-Z]\)\{5\}[0-9]\([a-zA-Z]\)\{2\}'
)

2. grep, cut, /etc/passwd
-------------------------
Zadání: Z řádku, které jste získali v příkladu 1 vypište pouze celé jméno. V /etc/passwd je to pátá položka.

Řešení:

grep -v '^\([a-zA-Z]\)\{4\}\([0-9]\)\{4\}' /etc/passwd | cut -d':' -f5

3. grep, cut, tr, /etc/passwd
-----------------------------
Zadání: Vypište uživatele získané v příkladu 1 ve tvaru UID=full_name. př. pro uživatele jehož řádek v /etc/passwd vypadá takoto:
root:x:0:1:SYSTEM Superuser:/root:/bin/bash
vypíše 0=SYSTEM Superuser

Řešení:

grep -v '^\([a-zA-Z]\)\{4\}\([0-9]\)\{4\}' /etc/passwd | /
cut -d':' -f3,5 | tr ':' '='

4. awk (a možná i něco jiného )
-------------------------------
Zadání: Napiště program, který ze zadaného HTML souboru vypíše všechny URL na které z dokumentu vedou odkazy. Předpokládejte odkazy tvaru <A HREF=""> kde A HREF může být jakákoliv kombinace malých a velkých písmen. Jako doplněk můžete dodělat, že se adresy, pokud budou úplně shodné, nebudou vypisovat vícekrát. Vlastně by vyhodil úplně totožné řádky.

Řešení:

awk 'BEGIN {FS="\""} ( $1 ~ /[aA] [hH][rR][eE][fF]=/ ) {print $2}'

Na splnění bonusového úkolu stačí přidat ještě: | uniq

5. awk (asi nejlepší...)
---------------------
Zadání: Napište script, který bude fungovat jako jednoduchá kalkulačka s operacemi + - * / v postfixové (tzv. polské) notaci.
Např. pro vstup 5 3 + 2 / vyhodí výsledek 4.
Tento příklad je tu spíš jen pro informaci, že se dá udělat téměř cokoliv.

Řešení:

{ vstup=$0;
top=0;
pocet=split(vstup,zapis," ");
for (i=1;i<=pocet;i++)
{
if (zapis[i]=="*")
{
top=top-1;
if (top<1) { printf("Chyba *"); exit }
zasobnik[top]=zasobnik[top]*zasobnik[top+1]
}
else if (zapis[i]=="/")
{
top=top-1;
if (top<1) { printf("Chyba /"); exit }
zasobnik[top]=zasobnik[top]/zasobnik[top+1]
}
else if (zapis[i]=="+")
{
top=top-1;
if (top<1) { printf("Chyba +"); exit }
zasobnik[top]=zasobnik[top]+zasobnik[top+1]
}
else if (zapis[i]=="-")
{
top=top-1;
if (top<1) { printf("Chyba -"); exit }
zasobnik[top]=zasobnik[top]-zasobnik[top+1]
}
else
{
top++;
zasobnik[top]=zapis[i]
}
}
printf("Vysledek : %d\n",zasobnik[top])
}

6. ls - zajímavá věc, kterou byste měli vědět
------------------------------------------
Zadání: Víte jak jednoduše zobrazit všechny soubory v daném adresáři, ale kromě '.' a '..' ???

Řešení:
Po prostudování všech parametrů příkazu ls (např. ls --help) se dozvíte, že existuje switch -A, který zaručí že je výpis bez '.' a '..' tedy stačí napsat ls -Aa a máte všechny soubory bez těch dvou, které vám vadily.