Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás
8. Laboratóriumi gyakorlat: Bevezetés a reguláris kifejezések használatába A gyakorlat célja 1. A reguláris kifejezések használatának megismerése. Az egrep parancs használatának elsajátítása 2. További feladatok vezérlőszerkezetekkel, a vezérlőszerkezetek alkalmazása szövegfeldolgozással kapcsolatos feladatokra. Előkészülethez szükséges anyag: 8. előadás segédlete, a grep kézikönyv lapja. A 6-7. előadás vezérlőszerkezeteinek ismétlése. Teszt állományok: a tesztelésekhez szükséges állományok (numb.txt, bible.txt, szavak.txt,stb.) letölthetők innen. Az egrep –color=auto opcióval indítva a sorok listázásakor színessel írja ki az illesztés helyét, ha a terminál ezt támogatja. Ezt beállíthatjuk egy környezeti változóval is, ehhez írjuk az alábbi parancsot a .bashrc állományunk végére: export GREP_OPTIONS='--color=auto'
Az alábbi példa illusztrálja ezt: $ echo abcdef | egrep abc abcdef $ export GREP_OPTIONS='--color=auto' $ echo abcdef | egrep abc abcdef $
A gyakorlat menete: 1. Feladatok az egrep-el .......................................................................................................................1 2. A $(( )) és (( )) szerkezetek ismétlése.............................................................................................5 3. Az egrep és [[...]] használata feltételként.........................................................................................6
1. Feladatok az egrep-el 1.1 Az echo-t és az egrep programot valamint a -o kapcsolót használva, határozzuk meg olyan bővített (extended) reguláris kifejezéseket, amelyek az alábbi sztringekre illeszkednek. Jelölés: a sztringeket aposztrófok közé zárva adjuk meg, az aposztróf nem tartozik hozzá a sztringhez. A kifejezéseknek a példaként megadott sztringekre illeszkedniük kell. a. A sztring tartalmazza a kis a karaktert. 'a' 'aa bb cc da'
b. A sztring tartalmaz egy számjegyet. 1
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás 'abc 3 def' '2'
c. A sztring tartalmazza a + vagy . karaktereket. 'a+2' '.'
d. A sztring 2 karaktert tartalmaz amelyek az a, b, c , + vagy ? lehetnek. 'bc' '+a' '??'
e. A sztring legalább egy kis x karaktert tartalmaz. 'abcxdefá' 'cdexxxxklm' 'x'
f. A sztring bármennyi kis x karaktert tartalmaz, amelyek egy kis a és egy nagy A között állnak. 'axxxxA' 'axA' 'aA'
g. A sztring két kis x között tartalmaz vagy nem tartalmaz nagy X karaktert: 'abc xXx def' 'abc xx def '
h. Egy = jel után egy egész szám következik vagy hiányzik, mindez a sztring végén van. 'szám =2' 'szám =27865' 'szám ='
i. Egy = karakter után néha egy egész szám következik, máskor a nulla szó. 'szám =2' 'szám =27865' 'szám =nulla'
j. A sztring legalább 2, de maximum 5 kis x-et tartalmaz. 'abcxxdef' 'xxxxxabce'
k. A sztring pontosan egy nagybetűt tartalmaz: 'A' 'B'
l. Az üres sztring (nincs egyetlen karakter sem a sorban) ''
2
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás
m. A sztring csak kisbetűket tartalmaz, legalább egyet, pl.: 'a' 'zb' 'abcxoljhsujhekl'
n. A sztring legalább egy számjegyet tartalmaz, mint az alábbiak: '1' '234534' '33'
o. A sztring pontosan 1, bármilyen karaktert tartalmaz: 'a' 'A' ';' 'u' '*'
p. A sztring legalább 1 nagybetűt, és utána akármennyi kisbetűt tartalmazhat: 'A' 'Az' 'Zkjhguytg' 'Cfs'
q. A sztring 2 kisbetűből álló szót, és köztük pontosan egy elválasztó karaktert (szóköz karakter) tartalmaz. 'erre gyere' 'nincs itt' 'a fejem'
r. A sztring legalább 2 de legfeljebb 4 számot tartalmaz: '23' '345' '2367'
s. A sztring bármennyi, kisbetűvel írt, és legalább egy szóközzel elválasztott szóból áll: '' 'alma' 'alma hatalma' 'a kis ember' 'a kis ember haza
megy'
t. A szöveg pontosan egy kisbetűből vagy nagybetűvel írt szóból áll: 'alma' 'ALMA'
o. A kifejezés arra a szóra illeszkedik, amellyel valaki egy dátum hónap részét adta meg: '06 'JUN' '-06-'
3
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás '/06/'
u. A kifejezés ellenőrzi egy telefonszám beírását az alábbi formákban: '+40-722-268-596' '40-722-268-596' '(0)722-268-596' '722268596' '722-268-596'
v. A kifejezés olyan kisbetűből álló sztringeket keres, amelyek elhatárolt kisbetűs szavak. Az alábbi szövegekben a kiemelt részekre kell kifejezést illeszteni: 'alma' ' egy alma' ',alma,' 'ERRE ARRA,mint az:alma'
x. Azokat a számsorokat kell eltalálni, amelyeknek a bal oldalán word típusú karakter, a jobb oldalán pedig szóhatár van: 'a12 ' '324' 'arra678956456 56626626'
y. Az olyan szavakat, amelyek beépülnek két word karakter közé: '123' '3almaf' 'abrakadabra' ' palma3;'
z. A kifejezés illeszkedjen az olyan sorokra amelyben román autó rendszámtábla van beírva, pl.: MS-02-ABF . 1.2. Az egrep segítségével listázzuk ki a numb.txt -ből: a. Íjuk ki, hány sorban fordul elő az 'every' szó: csak a találati sorok számát. b. Írjuk ki a sorokat amelyben az 'every' található c. A -o kapcsolót és a wc parancsot használva írjuk ki hányszor fordul elő a 'the' szócska a fájlban. c. Írjuk ki azokat a sorokat amelyekben az 'undertow' szó található: utána hívjuk meg az egrep-et úgy, hogy csak a találatokat listázza! d. Írjuk ki azokat a sorokat amelyekben nincs e betű, utána amelyekben nincs x betű! e. Az előbbi feladatnál megjelennek az üres sorok is: hívjuk meg olyan kifejezéssel az egrep-et, hogy a fenti feltételek listázásánál ne jelenjenek meg üres sorok! f. Hívjuk meg úgy az egrep-et, hogy szó listát készítsen a numb.txt valamennyi szavából. Majd végezzük el ugyanezt a bible.txt és a hamlet.txt állománnyal: hány különböző szó van ezekben? 1.3 Listázzuk ki egy állománynév név illetve kiterjesztés részét külön külön az egrep-el, pl. alma.txt-ből listázzuk ki külön az alma illetve .txt részeket. 4
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás
1.4. A szavak illetve words állományok egy magyar illetve angol szókészletet tartalmaznak. Keressünk magyar illetve angol szavakat, amelyek különböző mintáknak tesznek eleget, pl. -melyek azok a magyar szavak amely a-val kezdődnek, b-vel végződnek és 4 betűből állnak? -melyik szavakban van 3, 4, 5, 6 magánhangzó egymás után? -melyik szavakban van ugyanaz 2, 3, 4, 5 kisbetű a szó elején és végén? A magyar változatnál állítsuk be a LANG környezeti változó hu_HU.utf-8 értékre. Írjuk be a .bashrc állomány végére: export LANG=hu_HU.utf-8
1.5. Az egrep, uniq, sort parancsokat használva írjunk ki egy listát egy adott állományban található szavak előfordulásának gyakoriságáról. Ha működik, írjuk be egy szkriptbe a megoldást, és egy indító paraméterrel szabályozzuk azt is, hogy hány szót írjon ki az elsőkből. A uniq parancs -c kapcsolója kiírja a sorok elé az előfordulásuk számát. A sort egy szöveges állomány első mezeje szerint numerikusan és fordított sorrendben az alábbi kapcsolókkal rendez: sort -k1,1 -nr file.txt
Pl. a numb.txt esetében a szkriptnek az alábbit kell kiírnia ha az első 5 leggyakrabban előforduló szót kérjük: 14 12 9 8 6
i you in the undertow
a bible.txt esetében pedig: 59829 37582 33003 12849 12270
the and of to And
.
2. A $(( )) és (( )) szerkezetek ismétlése 2.1. Írjuk ki a $(( )) segítségével, hogy: -van-e paraméter a parancssoron -az első argumentum nagyobb-e mint a második -ha pl. 3 argumentumot várunk, írjuk ki külön-külön ha túl kevesebb vagy több argumentummal indították a programot. 2.2. Írjunk while ciklist amelyik a (( )) szerkezetet használja: végezzünk el annyi ciklust amennyit a parancssor első argumentumában megadunk. 5
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás
2.4. Járjuk végig while ciklussal és (( )) szerkezettel a parancssor argumentumait, és case szerkezettel döntsük el, hogy egy-egy argumentum megfelel-e az alábbi mintáknak: -egy karakteres számjegy -kapcsoló ( - jel és utána egy kisbetű) -állomány név típus végződéssel (van a névben egy . és utána 3 karakter 2.5. ( hr.sh ) Írjunk egy kis programot amelyik kiír egy sort egy bizonyos karakterből és utána az újsor karaktert. Az alábbi kapcsolókat és egy paramétert használunk: -c kar -n
: a kar karaktert írja ki, ha nem adjuk meg az implicit érték a # : a program -n kapcsolóval nem ír újsor karaktert a sorozat végén
szám
: ez a paraméter, csak szám karaktert ír ki, ha nem adjuk meg az implicit érték a 72-t
Tehát a használat: hr.sh
[ -c kar ] [ -n ]
[szám]
Példák: $bash hr.sh ################################################################ ### $bash hr.sh -c '.' ................................................................ ... $bash hr.sh -c '.' 10 .......... $bash hr.sh -c '.' -n 10 ..........$
3. Az egrep és [[...]] használata feltételként 3.1. Az alábbi kis példában az egrep-et használjuk feltételként. A program megnézi, hogy a $1 paraméter végződése .txt -e? #!/bin/bash if [ -z $1 ];then echo "kerek egy argumentumot!" exit 1 fi if echo $1 | egrep -q '\.txt$' then echo az argumentum sztring vegzodese '.txt' fi
Írjunk egy programot, amelyik egy állományból (pl. egy bash szkript állományból) kiírja azokat a sorokat amelyek # karakterrel kezdődnek, mindaddig amíg megjelenik az első sor amelyik nem # karakterrel kezdődik ( neve legyen: getcomment.sh ) . a. oldjuk meg az egrep-el b. oldjuk meg a [[…]] szerkezettel
6
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás
3.2. Adott egy fájl amelyben Unix felhasználók listája van, pl: peter eva
Írjunk egy szkriptet amelyik kilistázza azokat a felhasználókat amelyeknek van könyvtáruk a /home könyvtár alatt, és nincsenek benne ebben a listában. 3.3 Írjunk egy szkriptet ( pick.sh) , amelyik a yes könyvtárból átmásolja azokat az állományokat, amelyekben egy bizonyos szó legalább N-szer szerepel egy másik könyvtárba. Például a: $ pick.sh yes good 2
parancsnak létre kell hoznia egy good nevű könyvtárat, és abba át kell másolnia a longdistance.txt, wurm.txt és a allgood.txt állományokat a yes könyvtárból, amelyekben a good szó 2-szer fordul elő. Tehát az első paraméter a meglevő könyvtár az állományokkal, a második a létrehozandó könyvtár és a keresett szó, a harmadik pedig egy szám: hányszor kell a szónak előfordulnia. A szkript: -ellenőrzi, hogy a forráskönyvtár (yes a fenti példában) létezik -ellenőriznie kell, hogy a létrehozandó könyvtár létezik-e. Ha igen, hibaüzenettel kilép. -létre tudta-e hozni a könyvtárat -át tudta-e másolni helyesen az állományokat -a lefutás után ki kell írni, hány megfelelő állományt kapott A program végigjárja a yes könyvtár állományait megnézi a egrep-pel, hogy hányszor fordul elő az állományban a szó, és ha ez a szám nagyobb mint kettő, akkor átmásolja a good könyvtárba az állományt. A egrep parancs -c kapcsolója adja meg azt, hogy egy minta hány sorban fordul elő: $ egrep -c the yes/timeanda.txt 24 $ egrep -o the yes/timeanda.txt | wc -l 29
a -o kapcsolója pedig annyi sort ír ki, ahányszor ténylegesen előfordul, ezt számoljuk a wc paranccsal.
7