- Stahuj zápisky z přednášek a ostatní studijní materiály
- Zapisuj si jen kvalitní vyučující (obsáhlá databáze referencí)
- Nastav si své předměty a buď stále v obraze
- Zapoj se svojí aktivitou do soutěže o ceny
- Založ si svůj profil, aby tě tví spolužáci mohli najít
- Najdi své přátele podle místa kde bydlíš nebo školy kterou studuješ
- Diskutuj ve skupinách o tématech, které tě zajímají
Studijní materiály
tahák pro začátečníky
UOS - Úvod do operačních systémů
Vyučující: Ing. Jan Trdlička Ph.D.
Zjednodušená ukázka:
Stáhnout celý tento materiáliff využít k vytvoření jakéhosi primitivního revizního systému. Místo
toho vám ale vřele doporučuji využít v praxi použitelnější moderní nástroje - jako jsou svn, či git
find
(FIND file) hledá soubory
Hledá soubory a adresáře podle specifikovaných vlastností
Př.: Nalezeni všech souboru v adresáři /home/courses/Y36UOS:
# dir=/home/courses/Y36UOS
# find $dir
Př.: Nalezeni všech obyčejných souboru:
# find $dir -type f
Př.: Větších než 1000 bloku:
# find $dir -type f -size +1000
Př.: Menších než 100 bajtu (znaku) :
# find $dir -type f -size -100c
Př.: Nalezeni všech obyčejných souboru mladších než týden:
# find $dir -type f -mtime -7
Př.: Starších než 10 dni:
# find $dir -type f -mtime +10
Př.: S i-nodem číslo 314338:
# find $dir -type f -inum 314338
Př.: S alespoň 1 dalším hardlinkem:
# find $dir -type f -links +1
Př.: Nalezeni všech souboru s nastaveným set-gid bitem:
# find $dir -perm -g+s
Př.: Vypsání jména souboru při každé splněné podmínce:
# find /usr/bin /usr/*/bin \
# -name '*awk' -print \
# -type l -print
Př.: Vypsání detailu nalezených souboru:
# find /usr/bin -name '*grep' -ls
Př.: Spuštěni externího příkazu:
# find /etc -type f -exec grep -l 'Solaris 10' {} \;
# find /etc -type f -exec grep -l 'Solaris 10' {} +
Př.: Spuštěni externího příkazu s dotazem:
# find ~ -type f -size 0 -ok rm {} \;
Př.: Nalezeni adresářů od hloubky 3:
# find . -type d | grep '/.*/.*/'
Tahák na UOS 2008/2009
sestavil Tomáš „Inza“ Jukin – http://www.dvojmo.cz
11
Př.: Smazáni prázdných souborů a souboru *.delme mladších než je soubor
asdf:
# find . -newer asdf \
# \( -size 0 -o -name '*.delme' \) \
# -ok rm {} \;
PŘÍKAZY – PROGRAMOVATELNÉ FILTRY
sed, awk
sed
(Stream Editor) řádkový programovatelný editor
sed [-n] [-f vstup] prikazy
Tento program zpracovává svůj vstup (předaný přes volbu –f, nebo rourou) a zpracovává jej po řádcích.
Neboli, pro každý řádek vstupu provede příkazy předané v parametru prikazy. V tomto parametru může být
uvedeno libovolné množství příkazů, oddělených středníky. Příkazy se uvádějí ve tvaru:
'podminkaAKCE'
kde podminka je podmínka, která musí být splněna před provedením AKCE. sed je řádkový editor a proto má
podmínka tento formát:
radekOD,radekDO
kde uvedené proměnné jsou čísla řádek, nebo regulární výrazy ohraničené v „/“ a „/“, a nebo speciální znak $
pro poslední řádek. Řádky jsou číslovány od 0. Není-li uveden radekDO, projede se až do konce souboru. Není-
li uvedeno ani radekOD, projede se celý soubor. Příkaz je jeden ze 4 příkazů uvedených níže. sed defaultně to,
co nesmažeme vypisuje. Toto chování se mění pomoví volby „–n“. Výsledný formát celé příkazové části tedy
vypadá takto:
'odkud1,kam1[dpq(s…)][;odkud2,kam2[dpq(s…)]]'
Volby:
-n tiskne pouze přikázané přes příkaz p
-f vstupní soubor
Příkazy:
d - zruší řádku
p - tiskne řádku
q - skončí
s/re1/re2/volby - nahradí re1 za re2, lze využívat regulární výrazy a
reference (\1, \2, …)
Př.: Vytisknout řádky 2-4:
$ sed -n '2,4p' data.txt
Př.: Vytisknout od 4 do konce:
$ sed -n '4,$p' data.txt
Př.: Vytiskne řádky nezačínající na J:
$ sed -n '/^J/p' data.txt
Př.: Vytisknout řádky od r. končicího na 38 po řádek končicí na 27:
$ sed -n '/38$/,/27$/p' data.txt
Př.: Náhrada:
$ sed 's/Praha/Louny/' data.txt
Př.: Nahradit dvoučíslí na konci řádky za nej + " let":
$ sed 's/[0-9][0-9]$/& let/' data.txt
Př.: Výpis souboru až po první prázdný řádek:
sed '/^$/q' /etc/init.d/nfs.server
Př.: Náhrada prvního slova man na řádku za !!man!!:
man man | sed 's/\/!!man!!/'
Př.: Náhrada druhého slova man na řádku za !!man!!:
man man | sed 's/\/!!man!!/2'
Př.: Náhrada všech slov man na řádku za !!man!!:
man man | sed 's/\/!!man!!/g'
Př.: Výpis pouze řádků, kde došlo k náhradě man za !!man!!:
man man | sed -n 's/\/!!man!!/gp'
Př.: Výpis kde došlo k náhradě bez ohledu na velikost písmen:
man man | sed -n 's/\/!!man!!/gp'
awk
(alfred v. Aho, peter j. Weinberger a brian w. Kernighan) programovací jazyk textových manipulací
awk program [soubor]
awk je programovací jazyk pro filtrování textu. Jak o každý programovací jazyk, tak i awk musí k práci mít svůj
program. Ten mu předáme v jeho prvním parametru. Může to být přímý vstup (zde často využívám operátor
"soubor1"; print $2 >"soubor2" }
zapíše první položku do souboru soubor1 a druhou položku do souboru soubor2. Lze použít i zápis >>.
Potom se do souboru přidává za konec. Jméno souboru může být proměnná, obsah zapisovaný do souboru
může být konstanta. Můžeme tedy napsat např.:
{ print "nesmysl" >>$2 }
Jako jméno souboru se použije obsah druhé položky (pozor, nesmí být prázdná). V tomto příkladě bude počet
řádků v jednotlivých souborech znamenat četnost slov ve druhém poli.
Podobně lze výstup z akce print předat rourou procesu. Např. poslat poštou na adresu 'zaznamenej':
{ print | "mail zaznamenej" }
Poznámka:
awk vychází z C, spousta věcí, z něj se zde dá použít, nawk (pokročilejší verze awk) podporuje také výchozí funkce.
Už i v awk si můžete napsat vlastní funkce.
Tahák na UOS 2008/2009
sestavil Tomáš „Inza“ Jukin – http://www.dvojmo.cz
13
PŘÍKAZY – ADMINISTRACE
chown, chmod, tar, unzip, exec, nice, renice, kill, nohup, ps, prstat, ptree, last
chown
(CHange OWNer) mění vlastníka souboru
chown [-R] kdo[:skupina] co
Mění vlastníka souboru. Smí pouze superuživatel
Volby:
-R rekurentní změna (včetně podadresářů)
code:
# chown –R admin:staff /home/web/
chmod
(CHange MODe) mění přístupová oprávnění k souboru
chmod [-R] vzor cil
Mění přístupová práva k souboru v parametru cil. Nastavuje právě podle vzor. Vzor je ve formátu X+/-/=Y, kde
X je jedno z a,u,g,o (All, User, Group, Others – všichni, vlastník, jeho skupina, ostatní) a Y je jedno z r,w,x
(Read, Write, eXecute – čtení, zápis, spouštění).Operátor může být plus (přidá práva), mínus (odstraní práva),
rovnítko (nastaví práva podle vzoru).
Volby:
-R rekurentní změna (včetně podadresářů)
code:
# chmod –R a+rw /home/web/
Př.: Udělá skript skript.sh spustitelným:
# chmod a+x skript.sh
Poznámka:
Vzor může také být octalové číslo (např. 0777 pro plný přístup všem).Více o právech viz. man chmod
tar
(Tape ARchiver) Serializer, spolupracuje s kompresory
tar [-c/t/x] [-vf] kam co
Komprese v UNIXu je realizována po částech. Zatímco na WIN je archivátor (RAR, nebo ZIP) program, který
provádí dvě činnosti (serializaci a kompresi), na UNIXu je filozofie, že každý program dělá obvykle jen JEDNU
věc, ale POŘÁDNĚ. Proto je i archivace rozdělena do dvou příkazů. Příkaz tar dělá serializaci (- z několika
souborů udělá jeden). Vlastní kompresi (ale zase jenom tu kompresi – kompresi jednoho souboru) pak již
provádějí jiné příkazy (zip, bzip2). Příkaz tar ale dnes již umí s těmito příkazy přímo interně spolupracovat
Volby:
-t [Test archive] otestuje (zkontroluje, vypíše obsah) archivu
-c [Create archive] vytvoří archiv
-x [eXtract archive] rozbalí archiv
-v ukecaný režim
-f čtení z/zápis do souboru
-z použij kompresi pomocí gzipu
-j použij kompresi pomocí bzipu2
code:
# tar –czvf mujarchiv.tar.gz mujadr_ke_kompresi
# tar –tzvf mujarchiv.tar.gz mujadr_k_otestovani
# tar –xzvf mujarchiv.tar.gz mujadr_k_rozbaleni
# tar –cf /dev/tape mujsoubor1 mujsoubor2
unzip
(UNZIP file) dekomprimuje soubory z formátu .ZIP
unzip co [kam]
Rozbalí .ZIP archiv zadaný parametrem co do umístění zadaného parametrem kam
Volby:
-x seznam souborů, které bude ignorovat
code:
# unzip my.zip
# unzip my.zip /home/myfiles
Poznámka:
Tento příkaz umí pouze rozbalovat .ZIP archivi, pro jejich kompresi slouží program „zip“. Na UNIXu ovšem není
„.zippování“ nejlepším možným způsobem archivace. Vřele doporučuji GZip.
exec
(EXECute) spustí program místo aktuální instance shellu exec
Tahák na UOS 2008/2009
sestavil Tomáš „Inza“ Jukin – http://www.dvojmo.cz
14
BASH normálně vytváří pro každý spuštěný program nový proces. Pomocí exec lze spustit program v aktuálním
procesu shellu (místo něj). Tedy jím lze například změnit jeho vstup a výstup.
code:
# exec >std.out 2>std.err
nice
(be NICE) spustí proces s nižší prioritou
nice [-X] [prikaz]
Spustí zadaný proces s nižší prioritou, lze ji uvést jako volbu „-s“, pokud není, použije se implicitní 10. Pokud
zavoláme nice bez parametru, zjistíme prioritu aktuálního procesu
Volby:
-X priorita, kde X je číslo od 1 do 20, čím vyšší, tím větší zpomalení
(snížení priority)
code:
# nice
# nice -7 sort velky_soubor > vystup.txt
# nice sort velky_soubor
Poznámka:
Superuživatel může zadáním záporné priority prioritu i zvyšovat
renice
(REset NICE) přenastaví prioritu již běžícímu procesu
renice +5 [-p pid | -u username]
Přenastaví prioritu již běžícímu procesu
Volby:
-X kde X je číslo priority, stejné jak u nice
-p PID cílového procesu
-u uživatelské jméno, pak se stahuje na všechny procesy spuštěné zadaným
uživatelem
code:
# renice +5 –p 28734
kill
(KILL process) zasílá signály procesům
kill [-KILL] [-X | -name] PID
Pošle procesu signál. Je efektivní, jen když je zasláno vlastníkem procesu, nebo super uživatelem. Defaultně
procesy ukončuje. Lze také zaslat jiný signál než k ukončení.
Volby:
-KILL force kill, když nefunguje normální kill, tohleto zabere
-X kde X je číslo signálu, který ze zašle místo ukončení
-name kde name je název signál, který se zašle místo ukončení
-l vypíše seznam dostupných signálů
code:
# kill 12345
# kill –KILL 12345
nohup
(NO HangUPs) spouští programy nezávisle na aktuální relaci
nohup prikaz
Spustí zadaný příkaz nezávisle na aktuální relaci (tzn. že poběží i po skončení BASHe)
code:
# nohup sort velky_soubor
ps
(Process Status) zobrazuje informace o procesech (aktuálního shellu)
ps [-U login]
Bez parametrů zobrazí informace o aktuálních procesech aktuálního shellu. S parametrem zobrazí procesy
zadaného uživatele.
Volby:
-U zobrazí procesy uživatele dle zadaného loginu (username)
code:
# ps
# ps –U root
Tahák na UOS 2008/2009
sestavil Tomáš „Inza“ Jukin – http://www.dvojmo.cz
15
Poznámka:
Příkaz má daleko více voleb viz man ps
prstat
(PRocess STATistics) zobrazí seznam aktuálně běžících procesů (v rámci PC)
prstat [-Z]
Zobrazí real-time se obnovující informace o procesech v systému. Přepínačem -Z lze zobrazit shrnutí
Volby:
-Z zobrazí i shrnutí
code:
# prstat
# prstat -Z
Poznámka:
Příkaz má mnohem více voleb, viz. man prstat
ptree
(Process TREE) Zobrazí strom procesu se zadaným id
Př.: Zobrazit strom aktuálního procesu:
# ptree $$
last
(LAST action) zobrazí seznam posledních akcí všech uživatelů
last
Zobrazí seznam (historii) všech provedených akcí všech uživatelů. Kvůli velikosti výstupu je vhodné zapsat do
roury s less, či head.
code:
# last | head
# last | less
Poznámka:
Nejnovější jsou uvedeny nahoře
PŘÍKAZY – PROGRAMOVÉ STRUKTURY
proměnné, pole, if, case, while, for, test, expr, let, shift, read, pomůcky pro ladění
Proměnné:
Volby:
$# Počet argumentu skriptu
$0 Jméno skriptu
$1, $2, … Argumenty skriptu
$* = $1 $2 $3 ...
$@ = $1 $2 $3 ...
"$*" = "$1 $2 $3 ..."
"$@" = "$1" "$2" "$3" ...
$JMENO hodnota proměnné
${JMENO} hodnota proměnné
${JMENO:-text} je-li JMENO prázdné, pak vrátí text, jinak $JMENO
${JMENO:=text} je-li JMENO prázdné, pak JMENO=text a vrátí $JMENO
${JMENO:?text} je-li JMENO prázdné, pak vypíše text a konci (exit)
zrušení proměnné:
unset JMENO
vytvoření konstanty:
JMENO=HODNOTA
readonly JMENO
Pole:
Přiřazeni:
# JMENO[index]=HODNOTA
Čtení:
# ${JMENO[index]}
Čtení všech položek:
${JMENO[*]}
Počet položek v poli:
${#JMENO[*]}
Příkaz if:
Jednoduchá podmínka
Tahák na UOS 2008/2009
sestavil Tomáš „Inza“ Jukin – http://www.dvojmo.cz
16
code:
#!/bin/sh
if [ $# -ne 1 ] ; then
echo "volaní: $0 číslo_navratoveho_kodu"
exit 2
fi
exit $1
Příkaz case:
Složená podmínka
code:
#!/sbin/sh
case "$1" in
'start')
[ -x /usr/lib/lpsched ] && /usr/lib/lpsched
;;
'stop')
[ -x /usr/lib/lpshut ] && /usr/lib/lpshut
;;
*)
echo "Usage: $0 { start | stop }"
exit 1
;;
esac
Příkaz while:
Cyklus s neznámým počtem opakování
code:
#!/bin/sh
MAX=5
I=1
while [ "$I" -le 10 ]
do
echo "Hodnota I je $I"
I=`expr "$I" + 1`
done
Příklad:
while :
do
/bin/echo "Zadej cele číslo [0,...99][k=konec]: \c"
read C
case "$C" in
k)
break
;;
[0-9]|[0-9][0-9] )
echo "Druha mocnina čísla $C je `expr $C \* $C`."
;;
*) echo "Špatný parametr."
esac
done
Příkaz for:
Cyklus s pevným počtem opakování
code:
#!/bin/sh
I=1
for E in Petr Jana Jiri Karel
do
echo "Element $I je $E."
I=`expr $I + 1`
done
test, [ ... ]
(TEST expression) testuje zadaný logický výraz
Volby:
AND: vyraz1 -a vyraz2
OR: vyraz1 -o vyraz2
NOT: ! vyraz1
\( přednostní vyhodnoceni \)
Operátory pro operace se SOUBORY:
[ -f soubor ] # soubor existuje a je obyčejným souborem?
[ -d soubor ] # soubor existuje a je adresářem?
[ -s soubor ] # soubor existuje a Není prázdný?
[ -e soubor ] # soubor existuje?
Tahák na UOS 2008/2009
sestavil Tomáš „Inza“ Jukin – http://www.dvojmo.cz
17
[ -L soubor ] # soubor existuje a je symbolickým linkem?
[ -r soubor ] # soubor existuje a má nastaveno právo r?
[ -w soubor ] # soubor existuje a má nastaveno právo w?
[ -x soubor ] # soubor existuje a má nastaveno právo x?
Příklad:
# [ -r "$P" ] && echo "soubor $P je čitelný"
Přepínače operaci s RETEZCI:
[ r1 = r2 ] Významy řetězce r1 a r2 jsou stejné?
[ r1 != r2 ] řetězce r1 a r2 jsou různé?
[ r1 \< r2 ] Je řetězec r1 v abeced před řetězcem r2?
[ r1 \> r2 ] Je řetězec r1 v abeced za řetězcem r2?
[ -z r1 ] Je řetězec r1 prázdný?
[ -n r1 ] Není řetězec r1 prázdný?
Příklady:
# A=Ales ; B=Jiri ; C="Dobry den"
# test "$B" \< "$C" ; echo $?
Přepínače operaci s CISLY:
[ n1 -eq n2 ] číslo n1 je rovno číslu n2?
[ n1 -ne n2 ] číslo n1 Není rovno číslu n2?
[ n1 -lt n2 ] číslo n1 je menší než číslo n2?
[ n1 -gt n2 ] číslo n1 je větší než číslo n2?
[ n1 -le n2 ] číslo n1 je menší nebo rovno číslu n2?
[ n1 -ge n2 ] číslo n1 je větší nebo rovno číslu n2?
Příklady:
# test 2 -lt 7 && echo "2 < 7"
expr
(EXPRession) počítá matematické výrazy
code:
# N=`expr $N1 + 3`
# N=`expr $N1 - $N2`
# N=`expr 10 \* 21`
# N=`expr $N1 / $N2`
# N=`expr $N1 % 5`
# A=`expr \( 5 + 3 \) \* 2`;
let nebo (( ))
(LET it be) počítá matematické výrazy user-friendly. Není nutno používat $ pro volání proměnných
Příklady:
((N = N1 + 3))
((N = N1 - N2))
((N = 10 * 21))
((N = N1 / N2))
((N = N1 % 5))
((N=2#1011)) #zaklad soustavy
((N= 2#1011 > 3)) #bitový posun doprava
shift
(SHIFT it) provede posun hodnot parametru
Vlastnosti:
posune hodnoty parametru vlevo: $i = ${i+n}
odebere Parametry z $* a $@
dekrementuje: $# = $# - n
Příklad:
#!/bin/bash
I=1
echo "Počet parametru: $#"
while [ $# -gt 0 ]
do
echo "Hodnota parametru $I: $1"
shift
I=`expr $I + 1`
done
read
(READ from input) Čte ze standardního vstupu
Použití:
# read P1 P2 P3
Tahák na UOS 2008/2009
sestavil Tomáš „Inza“ Jukin – http://www.dvojmo.cz
18
Popis:
Přečte jednu řádku ze vstupu. Podle proměnné $IFS rozdělí načtenou řádku na jednotlivé hodnoty.
Uloží první hodnotu do proměnné P1, druhou položku do proměnné P2 a ostatní hodnoty do proměnné P3.
Příklad:
#!/bin/sh
while :
do
/bin/echo "Zadej cele číslo [0,...99][k=konec]: \c"
read C
case $C in
k)
break
;;
[0-9]|[0-9][0-9] )
echo "Druha mocnina čísla $C je `expr $C \* $C`."
;;
*) echo "Špatný parametr."
esac
done
Př.: Čtení dat ze souboru:
#!/bin/sh
echo "Informace od uživatelích v /etc/passwd"
IFS=":"
while read JMENO NIC UID GID POPIS DIR LOGSHELL
do
echo "Účet $JMENO má:"
echo " UID=$UID"
echo " GID=$GID"
echo " HOME=$DIR"
echo " SHELL=${LOGSHELL:-Není definován}"
done < /etc/passwd
Pomůcky pro ladění:
jak efektivně ladit skripty?
code:
sh -v ./script # předem echuje Příkazy
sh -x ./script # předem echuje Příkazy, nahrazené spec. znaky
OSTATNÍ
To, co se nevešlo jinam…
Existují příkazy „ypcat“, atd. Jsou shodné se svými protějšky bez „yp“, akorát že data načítají z NISu (síťového
úložiště)
Př.: Porovnáni slov z prvních 300 řádků výstupu man man, které nejsou v
souboru /usr/share/lib/dict/words:
man man \
| head -300 \
| tr '[A-Z]' '[a-z]' \
| tr -cs '[a-z]' '[\n*]' \
| sort \
| uniq \
| comm -23 - /usr/share/lib/dict/words \
| tee unknown.words \
| wc -l
Vloženo: 1.03.2010
Velikost: 1,08 MB
Komentáře
Tento materiál neobsahuje žádné komentáře.
Copyright 2023 unium.cz. Abychom mohli web rozvíjet a dále vylepšovat podle preferencí uživatelů, shromažďujeme statistiky o návštěvnosti, a to pomocí Google Analytics a Netmonitor. Tyto systémy pro unium.cz zaznamenávají, které stránky uživatel na webové stránce navštívil, odkud se na stránku dostal, kam z ní odešel, jaké používá zařízení, operační systém či prohlížeč, či jaký má preferenční jazyk. Statistiky jsou anonymní, takže unium.cz nezná identitu návštěvníka a spravuje cookies tak, že neumožňuje identifikovat konkrétní osoby. Používáním webu vyjadřujete souhlas použitím cookies a následujících služeb: