Operációs rendszerek Segédprogramok, szűrők
Vadász2 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ász3 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ász4 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ász5 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ász6 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ász7 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ász8 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ász9 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ász10 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/shakkor is az sh dolgozik, –#!/bin/kshakkor a Korn shell dolgozza fel, –#/bin/bashakkor a Bourne again shell, –#/bin/cshakkor a c-shell, –ezektől eltérő kommentár: az interaktív shell!
Vadász11 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ász12 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ász13 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ász14 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ász15 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ász16 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 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ász17 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ász18 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ász19 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ász20 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ász21 A regex elemek: atom Atom: kerek zárójelek közötti regex (regex), vagy alábbiak egyike cc normális karakter, önmagára illeszkedik \cc speciális karakter, önmagára illeszkedik.. (dot) bármely nem újsor karakterre illeszkedik [chars]Egyetlenre a bezártak közül, adható tartomány is [^chars]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
Vadász22 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ász23 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ász24 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ász25 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ász26 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ász27 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ász28 Gyakori vizsgálat: val csak számokat tartalmaz? if echo $val | grep ‘[^0-9]’ > /dev/null then echo ‘ez nem numerikus’ elseecho ‘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ász29 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. Aho-Weinberger -Kerighan
Vadász30 Az awk program Formája: [ 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ász31 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ász32 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ász33 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ász34 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ász35 Néhány awk változó $1, $2 stb. a szavak. A $0 pedig az egész sor! FSa mezőelválasztó karakter NFa mezőszám az aktuális sorban NRaz aktuális sor sorszáma RSaz input sorok elválasztó karaktere FILENAMEaz aktuális input fájl neve stb. továbbá az awk programokban a felhasználó által definiált változók
Vadász36 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ász37 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ász38 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 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
Vadász39 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ász40 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ász41 Egy példa Van egy szovegfájlunk: joe200 mary400 joe400 john300 susie500 mary200 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ász42 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!
Operációs rendszerek Segédprogramok, szűrők Vége