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ő Segédprogramok, szűrők, Vadász, 2008. Ea3 2 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. Segédprogramok, szűrők, Vadász, 2008. Ea3 3 1
Fájlokkal kapcsolatos tesztek Csak néhány példa, test -f file test -d file test -r file test -s file 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 stb. Segédprogramok, szűrők, Vadász, 2008. Ea3 4 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 Segédprogramok, szűrők, Vadász, 2008. Ea3 5 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! Segédprogramok, szűrők, Vadász, 2008. Ea3 6 2
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 Segédprogramok, szűrők, Vadász, 2008. Ea3 7 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 Segédprogramok, szűrők, Vadász, 2008. Ea3 8 A read parancs read valt1 valt2... Beolvas egy sort az stdinről, és az első szót a valt1- be, másodikat valt2-be s.í.t. teszi. Ha több szó, mint változó: Információátadás a sh-nek: paraméterekkel, exportált változóval, fájlokkal, read paranccsal az utolsóba a maradék szavak listája. Segédprogramok, szűrők, Vadász, 2008. Ea3 9 3
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! Segédprogramok, szűrők, Vadász, 2008. Ea3 10 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 Segédprogramok, szűrők, Vadász, 2008. Ea3 11 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 Segédprogramok, szűrők, Vadász, 2008. Ea3 12 4
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. Segédprogramok, szűrők, Vadász, 2008. Ea3 13 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. Segédprogramok, szűrők, Vadász, 2008. Ea3 14 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. Segédprogramok, szűrők, Vadász, 2008. Ea3 15 5
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álasztó nélküli sorokat. Segédprogramok, szűrők, Vadász, 2008. Ea3 16 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 Segédprogramok, szűrők, Vadász, 2008. Ea3 17 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 Segédprogramok, szűrők, Vadász, 2008. Ea3 18 6
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. Segédprogramok, szűrők, Vadász, 2008. Ea3 19 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ó. Segédprogramok, szűrők, Vadász, 2008. Ea3 20 A regex elemek: atom Atom: kerek zárójelek közötti regex (regex), vagy alábbiak egyike c \c. [chars] [^chars] ^ $ c normális karakter, önmagára illeszkedik c speciális karakter, önmagára illeszkedik. (dot) bármely nem újsor karakterre illeszkedik Egyetlenre a bezártak közül, adható tartomány is Egyetlenre a bezártakon kívül, tartomány is lehet Első karakter előtti üres szövegre Utolsó karakter utáni üres szövegre Segédprogramok, szűrők, Vadász, 2008. Ea3 21 7
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* atom+ atom- az atomnak nulla vagy több előfordulására illeszkedik az atomnak egy vagy több előfordulására illeszkedik az atomnak nulla vagy egy előfordulására illeszkedik Segédprogramok, szűrők, Vadász, 2008. Ea3 22 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 Segédprogramok, szűrők, Vadász, 2008. Ea3 23 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 Segédprogramok, szűrők, Vadász, 2008. Ea3 24 8
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 Segédprogramok, szűrők, Vadász, 2008. Ea3 25 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! Segédprogramok, szűrők, Vadász, 2008. Ea3 26 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! Segédprogramok, szűrők, Vadász, 2008. Ea3 27 9
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! Segédprogramok, szűrők, Vadász, 2008. Ea3 28 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. Segédprogramok, szűrők, Vadász, 2008. Ea3 29 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 Segédprogramok, szűrők, Vadász, 2008. Ea3 30 10
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ű Segédprogramok, szűrők, Vadász, 2008. Ea3 31 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 Segédprogramok, szűrők, Vadász, 2008. Ea3 32 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! Segédprogramok, szűrők, Vadász, 2008. Ea3 33 11
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!) Segédprogramok, szűrők, Vadász, 2008. Ea3 34 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 Segédprogramok, szűrők, Vadász, 2008. Ea3 35 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 Segédprogramok, szűrők, Vadász, 2008. Ea3 36 12
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 Segédprogramok, szűrők, Vadász, 2008. Ea3 37 Az awk beépített függvényei sqrt(), log(), exp(), int() length(string) substr(s,m,n) index(s,t) matematikai függvények string hosszát visszaadó s-ből m-től n-hosszan substringet s-ben t első előfordulásának indexe Néha kellene: shell változó értéket jutassunk az awk-ba! Linuxon csak a nawk-val: > nawk -v valt=shell_kif prog infile Egyébként: > awk valt=kif prog infile Segédprogramok, szűrők, Vadász, 2008. Ea3 38 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; } Segédprogramok, szűrők, Vadász, 2008. Ea3 39 13
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; Hivatkozás rá: valt print x; Hivatkozás rá: t_name[kif] sum[mary] Figyelem! Az indexkifejezés nem feltétlenül numerikus! Segédprogramok, szűrők, Vadász, 2008. Ea3 40 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! Segédprogramok, szűrők, Vadász, 2008. Ea3 41 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! Segédprogramok, szűrők, Vadász, 2008. Ea3 42 14
Operációs rendszerek Segédprogramok, szűrők Vége 15