430 likes | 548 Views
Operációs rendszerek. Segédprogramok, szűrők. A mai program. Hasznos, vegyes segédprogramok test, expr, read; startup programok Rekurzió Alapfogalmak szűrőkhöz A cut, head, tail, grep szűrők Reguláris kifejezések Az awk szűrő. Jó dolog a test parancs!. Két szintaxisa is van:
E N D
Operációs rendszerek Segédprogramok, szűrők
A mai program • Hasznos, vegyes segédprogramok • test, expr, read; startup programok • Rekurzió • Alapfogalmak szűrőkhöz • A cut, head, tail, grep szűrők • Reguláris kifejezések • Az awk szűrő Vadász
Jó dolog a test parancs! • Két szintaxisa is van: test kifejezes [ kifejezes ] • Szemantika: Normális (igaz) visszatérési értéke van, ha a kifejezés (szemantikailag) igaz! • A kifejezés lehetőségeknek 2 csoportja van: • Fájlokkal kapcsolatos tesztek, • adatszerkezetek relációi. Vadász
Fájlokkal kapcsolatos tesztek Csak néhány példa, test -f file test -d file test -r file test -s file stb. az első szintaxissal # file létezik és sima fájl # file létezik és jegyzék # file létezik és olvasható # file létezik és 0-nál hosszabb Vadász
Adatrelációk Példák itt is, [ ertek1 -gt ertek2 ] [ ertek1 -eq ertek2 ] stb. [ s1 = s2 ] [ s1 > s2 ] stb. [ -z s1 ] [ -n s1 ] [ s1 ] Igaz, ha # algebrailag nagyobb # algebrailag egyenlő # szövegként egyenlő # szövegként nagyobb # s1 füzér hossza 0 # s1 füzér hossz nem 0 # s1 füzér nem a null füzér Vadász
Jó dolog az expr parancs Szintaxisa: expr kifejezes expr kif1 op kif2 Pl.: sum=0 sum=`expr $sum \+ 1` echo $sum Szemantika: Kiértékelődik a kifejezés és az eredmény az stdout-ra íródik. Vannak algebrai operátorok, zárójelezés lehetséges. Semlegesítés! Itt parancsbehelyettesítés! Vedd észre fehér karaktereket! Vadász
bell burokprogram n=${1-1} # mindenképp 1 while [ $n -gt 0 ] do echo -n \7 # sípol n=`expr $n - 1` # csökkenti n-et sleep 1 # alszik 1 sec-t done ---------------------- Így hívd: $ bell 3 # hármat sípol Vadász
Rekurzió lehetséges • Pl. a HOME-ban van egy rek shell program: --------------------------------------------------- cd $1 ; ls -l # és ha $1 nem jegyzék? for i in * do if test -f $i # ez nem a legjobb! then : # do-nothing parancs else $HOME/rek $i fi done --------------------------------------------------- Így hívom: $ rek dir Vadász
A read parancs read valt1 valt2 ... Beolvas egy sort az stdin-ről, és az első szót a valt1-be, másodikat valt2-be s.í.t. teszi. Ha több szó, mint változó: az utolsóba a maradék szavak listája. Információátadás a sh-nek: paraméterekkel, exportált változóval, fájlokkal, read paranccsal Vadász
Tanácsok 1 • Szabályozzuk, hogy bármi is az interaktív burkunk, a bourne shell dolgozza fel burokprogramjainkat! • Ha az első sor • nem kommentár: az sh dolgozik, • #!/bin/sh akkor is az sh dolgozik, • #!/bin/ksh akkor a Korn shell dolgozza fel, • #/bin/bash akkor a Bourne again shell, • #/bin/csh akkor a c-shell, • ezektől eltérő kommentár: az interaktív shell! Vadász
Tanácsok 2 • Tanulmányozzuk a login/burokindítási startup programokat! Sajátjainkat “igazítsuk“! • Vannak “rendszer-széles“ és “saját” startup-ok! Sorrend! • Fogalmak • Bejelentkezési burok (login shell) • Interaktív burok (tartozik hozzá konzol terminál) • Nem interaktív burok • Ahol van, a /etc/environment –beli definíciók bekerülnek a környezetbe Vadász
Tanácsok 2 • Login sh, bash, ksh • rendszerszéles: /etc/profile • saját: ~/.bash_profile # csak bash • saját: ~/.bash_login # csak bash • saját: $HOME/.profile • Interaktív bash (rshd daemonnal indított is) • Saját: ~/.bashrc • Nem interaktív bash • $BASH_ENV • POSIX interaktív (bash, ksh) • $ENV • TC shell burokindítási és login • rendszerszéles: /etc/cshrc • saját: ~/.cshrc ~/.login Vadász
Tanácsok 3 • Tanulmányozzák, mi hol található! Vannak konvenciók! • Jó összefoglalás a Bartók-Laufer könyv 72. oldalán. Vadász
A szűrők • Szabványos bemenetüket olvassák • azt szöveg-folyamnak tekintik, ami • sorvég karakterekkel sorokra tagolt. A sorokat így értelmezik. • Argumentumban is lehet a szabványos bemenet megadva. • A szabványos kimenetükre teszik a "szűrt" (átalakított) eredményüket. Vadász
Alapfogalmak a szűrőkhöz • A sor/rekord (line) • A mező, szó (field, word) • A mezőelválasztó karakter (field separator) • a fehér karakterek gyakran alapértelmezés szerintiek, • gyakori a : (colon) mezőelválasztó. • Egyes segédprogramokban beállíthatók. • Néha értelmezett a blokk. • Mindig a karakter. Vadász
A cut szűrő • A bemenet (file) sorainak kijelölt mezőit (táblázatok oszlopait) kivágja, és csak ezeket továbbítja • > cut -clist [file] • > cut -flist [-dchar] [-s] [file] • ahol list vessző-szeparált növekvő mezőszámok, tartományok. • -clist: oszlop-pozíciók. Pl. -c3,14-72 kivágja a 3. és a 14-72 pozíciókat. • -flist: mezőelválasztókkal (default=tab) szeparált mezőket azonosít, ahol is megadható az elválasztó: • -dchar argumentummal. • -s elnyomja a mezőelválsztó nélküli sorokat. Vadász
A cut szűrő, példák > cut -d: -f1-5 /etc/passwd # az első 5 mező # a passwd fájlból > name=`who am i | cut -f1 -d” ”` # login név a name-ba > cut -c2-3,5,7,38-54 myfile.txt # oszlopszámok szerint Vadász
A head és tail szűrők > head [-count][file] > tail [+-numb lbcr][file] > tail [-lbcr][file] > tail [+numb lbcf][file] > tail [-lbcf][file] # az első count sorát # +numb elejétől számított, # -numb végétől számított # adott sor (l), blokk (b), char (c). # -r startpont a fájl vége, nem számít az előjel és fordított sorrendű az l, b, c. # -f follow opció: ha nem csőbe szűr, másolás után blokkolódik, várva, hogy még hozzáfűznek. Pl.: $ tail +5 vmi | head -1 # kiírja a vmi 5. sorát Vadász
A grep család (grep, fgrep, egrep) > grep [opciok] minta [fájl-lista] Szemantika: olvassa a fájl-lista fájljainak sorait. Minden sorra illeszti a mintát. Ha találat van: kiírja azt a sort. Visszatér: 0 - normális, ha találat van, 1 - ha nincs egyetlen találat sem, 2 - ha akadály van. Opciók: -n # kiírja a sorszámokat is, -v # nem egyezést keres, -y # kis/nagybetűt megkülönböztet, -c # csak a sorszámot írja ki. Vadász
A szabályos kifejezések (Regular expressions) Sok szűrő (grep, awk, ed, lex stb) használja keresési mintaként.Különböztessük meg a fájlnév behelyettesítési mintától! Bartók-Laufer 107. oldal, Kernighan-Pike 335. oldal. A szabályos kifejezés (regex) szöveg, ami illeszkedik szövegre. Bennük bizonyos karaktereknek speciális jelentésük van , ezek a metakarakterek. Metakarakterek: újsor . [ ] ^ $ * | ( ) A regex elemek: atom, lezárt, összefűzött és unió. Vadász
A regex elemek: atom Atom: kerek zárójelek közötti regex (regex), vagy alábbiak egyike Vadász
A regex elemek: lezárt • Lezárt: olyan atom, amit opcionálisan egy postfix operátor követ (ebből: az atom degenerált lezárt) atom* az atomnak nulla vagy több előfordulására illeszkedik atom+ az atomnak egy vagy több előfordulására illeszkedik atom- az atomnak nulla vagy egy előfordulására illeszkedik Vadász
Regex elemek: összefűzött • Az összefűzött akárhány egymás utáni lezártból áll. • Először a első, utána a második s.í.t. lezárt illeszkedésekor az összefűzött is illeszkedik. • Miután akárhány lezárt alkothat összefűzöttet, a lezárt degenerált összefűzött Vadász
Regex elemek: unió • Akárhány összefűzött, melyeket a | karakter választ el • Illeszkedésnél választási lehetőséget ad: akár az első, akár a második s.í.t összefűzött illeszkedésénél az unió illeszkedik Vadász
Az illeszkedési példák abcd összefűzött karakterek önmagukra illeszkednek ^string összefűzött string a sor elején illeszkedik string$ összefűzött string a sor végén illeszkedik [...] atom, illeszkedik a ... közül egyetlen karakterre [^...] atom, bármely, egyetlen kar., ami nincs a ...-ban [a-z] [0-9] atom, egyetlen bezárt karakterre a tartományból [^A-D0-2] több tartomány és negáció lehetséges Vadász
Az illeszkedés c* [...]* lezárt, illeszkedik 0 v. több előfordulására c-nek c+ lezárt, illeszkedik 1 v. több előfordulására c-nek c? lezárt, illeszkedik 0 v. 1 előfordulására c-nek [.]* lezárt, bármilyen füzér .* lezárt, bármilyen füzér, akár üres is ^$ összefűzött, csak üres sorra illeszkedik ^[0-9]*$ csak számokat tartalmazó sorra illeszkedik Az awk-ban további lehetőségek is vannak! Vadász
Fájlnév-minta kontra reguláris kifejezés • Mindkettő minta, mindkettő illeszkedik, de az • egyik fájlnevek terére illeszkedik és fájlnév listára helyettesítődik be; • a másik szövegsorokra illeszkedik és akció következik be. • A burok a metakaraktereket kezeli: operátornak veszi őket, fájlnév behelyettesítő mintáknak stb. • Vannak közös „dzsókerek”. A reguláris kifejezéseket “el kell juttatni“ a szűrőkhöz. Semlegesíteni kell, nehogy a burok kifejtse azokat! • Ne feledkezzünk meg erről! Sok bosszúságot takaríthatunk meg! Vadász
Gyakori vizsgálat: val csak számokat tartalmaz? if echo $val | grep ‘[^0-9]’ > /dev/null then echo ‘ez nem numerikus’ else echo ‘ez tisztan numerikus’ fi Mit csinál ez? $ ls -l *txt # hosszú lista a txt-re végződő fájlokról Hosszú listát kérünk a nem txt-re végződőkről: $ ls -l | grep -v ‘txt$’ A sort szűrő Rendez. Nézz utána! Vadász
Az awk, nawk szűrő • Mintakereső és feldolgozó. Szövegfolyam sorokat olvas, minden sorban mintákat keres és a mintákhoz tartozó akciókat végrehajtja. • Szintaxis: > awk [-Fc][program][parameterek][fájl-lista] • Szemantika: beolvassa a sorokat. A sorok szavait rendre az 1, 2, stb. nevű változóiba teszi. Soronként illeszt a programban megfogalmazott minden mintát, és ha találat van, végrehajtja a mintákhoz tarozó akciókat a sorra. A mintamegadásban, az akciókban használhatja az $1, $2 stb. változótartalmakat, egyéb belső változóit is. Vadász Aho-Weinberger-Kerighan
Az awk program • Formája: [minta] {akciók} [minta ] {akciók} ... • Megjelenhet literálisan: awk ‘program’ • vagy szövegfájlban: awk -f fájlnév • Az akciók: C-szerű utasítások, utasításblokkok. > who | awk ‘{print $3 $4 $5 $1 $2}’ # nincs minta Vadász
Az awk akciók if (feltétel) utasítás [else utasítás] while (feltétel) utasítás for (kif1; kif2; kif3) utasítás break, continue {utasítás; utasítás; ...} printf formátum, kifejezéslista print kifejezéslista for (name in array) utasítás next exit C szerű awk szerű Vadász
Az awk minták • Legtöbbször reguláris kifejezések. Pl: ’/^Valami/ {print ”Megtalaltam sor elejen Valami-t.”}’ • Üres minta minden sorra illeszkedik. Pl.: ‘{print “Minden sorra kiirodik ez”}’ • Lehet a sor szavainak relációja is: ’$2==”valami” {print ”megtalaltam valami-t a 2. mezoben”}’ • Vannak speciális awk minták: BEGIN # az első sor előtt illeszkedik END # az utolsó sor után illeszkedik Vadász
Hangsúlyozom • A grep-ben egyetlen minta van, • az awk-ban több is. • A grep mintája minden sorra illesztendő, és találatkor ki/nem kiírni a sort. • Az awk-ban minden minta a leírt sorrendben minden sorra illesztendő, találatkor a mintához tartozó akció végrehajtandó. • Az awk-ban a BEGIN és az END nem utasítás zárójelek, hanem minták! Különlegesen illeszkednek! Vadász
Feladat: a második szó üres $2 == ““ $2 ~ /^$/ $2 !~ /./ length($2) == 0 NF < 2 A 2. mező üres A 2. mező egyezik az üres karakterlánccal A 2. mező semmilyen karakterrel nem egyezik A 2. mező hossza nulla (Az eddigiek bármilyen változóra is!) A mezőszám kisebb, mint kettő (Ez csak a 2. szóra!) Vadász
Néhány awk változó • $1, $2 stb. a szavak. A $0 pedig az egész sor! • FS a mezőelválasztó karakter • NF a mezőszám az aktuális sorban • NR az aktuális sor sorszáma • RS az input sorok elválasztó karaktere • FILENAME az aktuális input fájl neve • stb. • továbbá az awk programokban a felhasználó által definiált változók Vadász
Példák • Számláljuk az input sorait (kicsit erőltetetten!) awk ’ BEGIN {s=0} /* inicializálunk */ {s=s+1} /* minden sorra! */ END {print ”osszeg: ”, s} /* kiírunk */ ’ • Írjuk ki a passwd fájl 5. sorát! awk ’NR==5 {print $0}’ /etc/passwd • Írjuk ki a neveket, a gid-eket formázva! awk -F: ’{printf ”%8s %4s\n”, $1, $4}’ /etc/passwd awk ’BEGIN {FS=”:”} {printf ”%8s %4s\n”, $1, $4}’ /etc/passwd Vadász
Az awk operátorok ++ -- * / % + - < <= > >= == != ~ !~ ! && || = += -= *= /= %= pre/postfix inkrem. dekrem. multiplikatív operátorok additív operátorok kar.lánc összekapcs (a semmi op.) relációs op. ~ az egyezés operátora negáció logikai és logikai vagy értékadó operátorok Vadász
Az awk beépített függvényei sqrt(), log(), exp(), int() matematikai függvények length(string) string hosszát visszaadó substr(s,m,n) s-ből m-től n-hosszan substringet index(s,t) s-ben t első előfordulásának indexe Linuxon csak a nawk-val: > nawk -v valt=shell_kif ’prog’ infile Egyébként: > awk valt=kif ’prog’ infile Néha kellene: shell változó értéketjutassunk az awk-ba! Vadász
Példák • A PATH környezetváltozó: PATH=vmi:vmi1:vmi2 >set | awk ’BEGIN {FS=”:”} /PATH/ {for(i=1;i<=NF;i++) print $i }’ > echo $PATH | awk ’BEGIN {FS=”:”} {i=index($0, ”=”); print substr($1,i+1, length($i)-i); for(i=2;i<=NF; i++) print $i; }’ Vadász
Változók, tömbök az awk-ban Eddig: $1,…, NR, NF stb. Saját változó definiálható: valt ertekado_op kifejezes Pl: x = $2 * 15; Tömbváltozó definíció: t_name[konst_kif] ert_op kif Pl: sum[$1] = 0; Figyelem! Az indexkifejezés nem feltétlenül numerikus! Hivatkozás rá: valt print x; Hivatkozás rá: t_name[kif] sum[mary] Vadász
Egy példa Van egy szovegfájlunk: joe 200 mary 400 joe 400 john 300 susie 500 mary 200 Van egy awk programunk: {sum[$1] += $2} END {for (name in sum) print name, sum[name] } Így hívjuk meg: > awk -f prog szoveg 4 tömbelem definiálódott! Vadász
Az előző példához magyarázat sum[joe] sum[mary] sum[john] sum[susie] Az első akció minden sorra végrehajtódik. Csak 4 tömbelem definiálódik. A 2. akció a végén hajtódik végre. Különleges for ( ... in ...) ciklus! A ciklusban a name változó felvesz minden lehetséges index értéket! Most már megmagyarázhatod, mit is csinál a program! Vadász
Operációs rendszerek Segédprogramok, szűrők Vége