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,
az első szintaxissal
test test test test
# 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
-f -d -r -s
file file file file
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 ...
Információátadás a sh-nek: paraméterekkel, exportált változóval, fájlokkal, read paranccsal
• Beolvas egy sort az stdinről, és az első szót a valt1be, másodikat valt2-be s.í.t. teszi. • Ha több szó, mint változó: 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 saját: ~/.bash_login saját: $HOME/.profile
# csak bash # csak bash
• 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: – saját:
/etc/cshrc ~/.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] Pl.: $ tail +5 vmi | head -1
# 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. # 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 normális karakter, önmagára illeszkedik
\c
c 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 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* 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
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 ^string string$ [...] [^...] [a-z] [0-9] [^A-D0-2]
összefűzött karakterek önmagukra illeszkednek összefűzött string a sor elején illeszkedik ö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 atom, egyetlen bezárt karakterre a tartományból több tartomány és negáció lehetséges
Segédprogramok, szűrők, © Vadász, 2008.
Ea3 25
Az illeszkedés c* [...]* c+ c? [.]* .* ^$ ^[0-9]*$
lezárt, illeszkedik 0 v. több előfordulására c-nek lezárt, illeszkedik 1 v. több előfordulására c-nek 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 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 then else fi
echo $val | grep ‘[^0-9]’ > /dev/null echo ‘ez nem numerikus’ echo ‘ez tisztan numerikus’
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.
Aho-Weinberger-Kerighan
Ea3 29
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 END
# az első sor előtt illeszkedik # 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)
Néha kellene: shell változó értéket jutassunk az awk-ba!
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
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