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 gyakorlat célja a reguláris kifejezések használatának megismerése. A grep 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. 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. További feladatok vezérlőszerkezetekkel.........................................................................................4 3. A $(( )) és (( )) szerkezetek átismétlése...........................................................................................4 4. A grep és egrep használata feltételként............................................................................................4
1. Feladatok az egrep-el 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 egyszerű idézőjelbe zárva adjuk meg, az idézőjel nem tartozik hozzá a sztringhez. A kifejezéseknek a példaként megadott sztringekre illeszkedniük kell. a. Az üres sztring (nincs egyetlen karakter sem a sorban) ''
b. A sztring csak kisbetűket tartalmaz, pl.: 'a' 'zb' 'abcxoljhsujhekl'
c. A sztring bármennyi számot tartalmazhat, mint az alábbiak: ''
1
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás '1' '234534' '33'
d. A sztring pontosan 1 nagybetűt tartalmaz: 'A' 'B'
e. A sztring pontosan 1 bármilyen karaktert tartalmaz: 'a' 'A' ';' 'u'
f. A sztring legalább 1 nagybetűt, és utána bármennyi kisbetűt tartalmazhat: 'A' 'Az' 'Zkjhguytg' 'Cfs'
g. A sztring 2 kisbetűből álló szót, és köztük pontosan egy elválasztó karaktert (üres karakter) tartalmaz. 'erre gyere' 'nincs itt' 'a fejem'
h. A sztring legalább 2 de legfeljebb 4 számot tartalmaz: '23' '345' '2367'
i. 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'
j. A szöveg pontosan egy kisbetűből vagy nagybetűvel írt szóból áll: 'alma' 'ALMA' k. A kifejezés arra a szóra illeszkedik, amellyel valaki egy dátum hónap részét adta meg: '06 'JUN' 'June' '-06-' '/06/'
l. A kifejezés ellenőrzi egy telefonszám beírását az alábbi formákban: 2
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás '+40-722-268-595' '0040-722-268-595' '(0)722-268-595' '268595' 268-595'
m. A kifejezés olyan kisbetűből álló sztringeket keres, amelyek elhatárolt szavak, tehát csak alfanumérikus illetve _ karaktert tartalmaznak. Az alábbi szövegekben a kiemelt részekre kell kifejezést illeszteni: 'alma' ' egy alma' ',alma,' 'ERRE ARRA,mint az:alma'
n. Az olyan számsorokat kell eltalálni, amelyeknek a bal oldalán szavakat felépítő karakter, a jobb oldalán pedig szóhatár van: 'a12 ' '324' 'arra678956456 56626626'
k. Az olyan szavakat, amelyek beépülnek két szavakat felépítő karakter közé: '123' '3almaf' 'abrakadabra' ' palma3;'
2. A kifejezés illeszkedjen az olyan sorokra amelyben román autó rendszámtábla van beírva: MS-02-ABF . 3. Az egrep segítségével listázzuk ki a numb.txt -ből: a. Íjuk ki, hányszor fordul elő az 'every' szó: csak az előfordulási számot. b. Írjuk ki a sorokat amelyben az 'every' található 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 állománnyal: hány különböző szó van benne? 4. a. 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. 3
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás
b. Egy HTML anchor címke esetében: -emeld ki egy akármilyen szövegből -utána listázd ki belőle az URL részt:
Google
5. 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. melyik az a magyar szó amely a-val kezdődik, b-vel végződik és 4 betűből áll? A magyar változatnál állítsuk be a LANG környezeti változó hu_HU.utf-8 értékre. ha nincs, akkor Írjuk be: export LANG=hu_HU.utf-8
2. További feladatok vezérlőszerkezetekkel 1. Írjuk meg ismét a programot amely átnevez minden .sh típusú állományt .bash típusúvá egy könyvtárban. Az állomány típus karakterláncának leválasztásakor használjuk fel ezúttal az egrepet. A program legyen nagyon biztonságos: nehogy véletlenül is elvesztődjenek az állományok az átnevezés alatt (tehát ellenőrizzünk minden pontot a programban, ahol hiba állhat elő).
3. A $(( )) és (( )) szerkezetek átismétlése 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. Írjunk while ciklist amelyik a (( )) szerkezetet használja: végezzünk el annyi ciklust amennyit a parancssor első argumentumában megadunk. 3. 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ó: keressük a -c és -n kapcsolókat -3 kisbetű után egy nagybetű jön Írjunk egy kis programot amelyik kiír egy sort egy bizonyos karakterből. Az alábbi kapcsolókat használjuk: -c kar : a kar karaktert írja ki, ha nem adjuk meg implicit érték a # -n szám : csak n karaktert ír ki, iha nem adjuk meg implicit érték 72
4. A grep és egrep használata feltételként 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? 4
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás #!/bin/bash if [ -z $1 ];then echo "kerek egy argumentumot!" exit 1 fi if echo $1 | egrep '\.txt$' >/dev/null 2>&1 then echo az argumentum sztring vegzodese '.txt' fi
A standard kimenet és hibakimenet egyaránt a null eszközre van irányítva, mert nincs szükségünk rá: csak az érdekel, hogy az egrep talált-e vagy nem. Feladat: Í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: getkomment.sh ) . Használjuk fel a cut programot a # karakter sor eleji kivágására.
5