Operációs Rendszerek Gyakorlat

Hasonló dokumentumok
2. Készítsen awk szkriptet, amely kiírja az aktuális könyvtár összes alkönyvtárának nevét, amely februári keltezésű (bármely év).

AWK programozás, minták, vezérlési szerkezetek

AWK programozás Bevezetés

Operációs rendszerek. 10. gyakorlat. AWK - bevezetés UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

AWK programozás, minták, vezérlési szerkezetek

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Operációs rendszerek gyak.

BASH script programozás II. Vezérlési szerkezetek

BASH SCRIPT SHELL JEGYZETEK

Operációs rendszerek 2 3. alkalom - Reguláris kifejezések, grep, sed. Windisch Gergely windisch.gergely@nik.uni-obuda.hu

8. Laboratóriumi gyakorlat: Bevezetés a reguláris kifejezések használatába

Gyakorló feladatok az 1. nagy zárthelyire

Szkriptnyelvek. 1. UNIX shell

Operációs rendszerek. 9. gyakorlat. BASH recap, reguláris kifejezések UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Operációs Rendszerek II. labor. 2. alkalom

II. Mérés SZÉCHENYI ISTVÁN EGYETEM GYŐR TÁVKÖZLÉSI TANSZÉK

Operációs rendszerek. 9. gyakorlat. Reguláris kifejezések - alapok, BASH UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

7. Laboratóriumi gyakorlat: Vezérlési szerkezetek II.

1. Alapok. #!/bin/bash

8. Laboratóriumi gyakorlat: Bevezetés a reguláris kifejezések használatába

Szűrők Reguláris kifejezések, AWK

length (s): Az s karaklerlánc hossza, substr(s,m,n): Az s mezőben levő karakterláncnak az m-edik karakterétől kezdődő, n darab karaktert vágja ki.

Bevezetés a programozásba I.

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

S z á m í t ó g é p e s a l a p i s m e r e t e k

Operációs rendszerek. 4. gyakorlat. BASH bevezetés, script írása, futtatása UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

file./script.sh > Bourne-Again shell script text executable << tartalmat néz >>

Youtube videó letöltés és konvertálás Linuxon

Formális nyelvek és automaták

Operációs rendszerek 1.

Szűrők, reguláris kifejezések AWK programozás: minták, vezérlési szerkezetek, tömbök, beépített függvények, reguláris kifejezések

Írjon olyan programot a standard könyvtár alkalmazásával, amely konzolról megadott valós adatokból meghatározza és kiírja a minimális értékűt!

Ezek után már csak a Mentés és a Lekérdezés Futtatása (az ellenőrzés miatt) van hátra. Ügyeljünk, hogy a mentésnél a megadott (Kezd) nevet adjuk meg.

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

Flex tutorial. Dévai Gergely

C++ programozási nyelv

EGYSZERŰ SZÁMÍTÁSOK TÁBLÁZATKEZELÉS ELINDULÁS SZE INFORMATIKAI KÉPZÉS 1

PHP. Telepítése: Indítás/újraindítás/leállítás: Beállítások: A PHP nyelv

Reguláris kifejezések 1.

Bevezetés a programozásba

Webprogramozás szakkör

OEP Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1. Feladat. Elemzés 1

Az XCZ állományban szereplő állományok nevének UTF-8 kódolásúnak kell lennie. Probléma esetén használjon ékezet nélküli állományneveket.

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

1. feladat Készítse el szövegszerkesztővel, majd mentse osztály.txt néven a következő tartalmú szöveges fájlt:

Soros felépítésű folytonos PID szabályozó

QBE Édes Otthon lakásbiztosítás tarifáló webservice. Fejlesztői dokumentáció 1.0.2

Gyakorló feladatok Gyakorló feladatok

7. Laboratóriumi gyakorlat, 1. rész : Vezérlési szerkezetek II.

HTML ÉS PHP ŐSZI FÉLÉV

Megjegyzés: A programnak tartalmaznia kell legalább egy felhasználói alprogramot. Példa:

Programozás alapjai. 6. gyakorlat Futásidő, rekurzió, feladatmegoldás

openbve járműkészítés Leírás az openbve-hez kapcsolódó extensions.cfg fájl elkészítéséhez

H N S A d a t K a p c s o l a t

Példa: Aktuális könyvtár tartalmának fájlba mentése, melynek neve az aktuális dátum és idő: ls l > `date+%f_%h-%m`.txt

Delphi programozás I.

Egyszerűbb a Google keresőbe beírni a Sharepoint Designer 2007 letöltés kulcsszavakat és az első találat erre a címre mutat.

EDInet Connector telepítési segédlet

BEKÉRT ADAT KÉPERNYŐRE ÍRÁSA KÖRNYEZETI VÁLTOZÓK FÁJL REDEZETT KIÍRÁSA KÖNYVTÁRBAN BEJEGYZÉSEK SZÁMA FÁJLBAN SZÁM NÖVELÉSE. #!

Fájlszervezés. Adatbázisok tervezése, megvalósítása és menedzselése

Munka állományokkal. mv: áthelyezés (átnevezés) rm: törlés. rmdir: üres könyvtár törlése. -r, -R: rekurzív (könyvtár) -r, -R: rekurzív (könyvtár)

Tájékoztató. Használható segédeszköz: -

1. gyakorlat

Felhasználói leírás a DimNAV Server segédprogramhoz ( )

A sed folyamszerkesztő

Írásjelek helyes szedése. Szabó Csaba. Mondatvégi írásjelek. Központozás. Kötőjelfélék. Szabó Csaba november 18.

KARAKTERFELISMERÉS AZ EVASYS-BEN

Munka állományokkal, könyvtárakkal I.

Felhasználói dokumentáció. a TávTagTár programhoz. Készítette: Nyíri Gábor, hdd@nc-studio.com GDF Abakusz regisztrációs kód: GDFAba43

6. fejezet: Ciklusok

Gyakran ismételt kérdések Ipari és kereskedelmi rendszer

Felvételi tematika INFORMATIKA

Rendszerprogramozás Linux környezetben

Regionális forduló november 18.

Bevezetés a programozásba I.

Regionális forduló november 19.

Access gyakorlati feladatok lépésről lépésre

32. A Knuth-Morris-Pratt algoritmus

A sed folyamszerkesztő

Tranzakció import funkció import fájl formátumai

PHP-MySQL. Adatbázisok gyakorlat

Oktatási Hivatal. A 2014/2015 tanévi Országos Középiskolai Tanulmányi Verseny döntő fordulójának feladatai. II. (programozás) kategória

Tájékoztató. Használható segédeszköz: -

Rövid leírás a Make Your Mark szoftver használatához

MATLAB. 9. gyakorlat. Cellatömbök, struktúrák, fájlműveletek

A legfontosabb DOS parancsok

Operációs rendszerek gyakorlat

Lekérdezések az SQL SELECT utasítással


Hungaropharma Zrt. WEB Áruház felhasználói útmutató. Tartalomjegyzék

Operációs rendszerek 2 1. óra: Linux alapok Ismétlés. Windisch Gergely félév

Operációs rendszerek. 1. gyakorlat. Bevezetés, követelmények UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Jelentés fájl struktúra a TXT formában készülő jelentések részére

Bevezetés az informatikába

Algoritmuselmélet 7. előadás

3. ZH-ban a minimum pontszám 15

BaBér bérügyviteli rendszer telepítési segédlete év

C memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre.

Közönséges differenciál egyenletek megoldása numerikus módszerekkel: egylépéses numerikus eljárások

Programozási segédlet

Átírás:

. feladat Operációs Rendszerek Gyakorlat Második zh. felkészülés, gyakorlás 207 május 2. - Berta Árpád Készíts egy bash scriptet, amely a paraméterről kapott szóközzel elválasztott kifejezések közül kiírja a szabályos születési dátumokat. Elfogadható dátumnak számít, amely 900-207 közötti évszámokat tartalmaz. Alakja pedig olyan, hogy pontokkal vannak elválasztva és számokkal vannak ábrázolva a hónapok (hónap, nap két számjegyű ábrázolás). Azzal most nem foglalkozunk, hogy egy hónap 28,30,3 napos-e, így a szökőévekkel sem. Feltesszük, hogy minden hónap esetében elfogadható a 3 nap. Arra viszont figyelj oda, hogy a dátum pontosan ilyen lehet, tehát bővebb dátumok sem fogadhatóak el.?>./_beapait.sh 200.0.0 2020.0.0 207.2.3 900.09.2 920..0 920.0.0 920.0.02 920.3.0 920.2.32 920.2.00 920.00.0 920A0A0 920-0-0 200.0.0 207.2.3 900.09.2 920.0.0 Megoldás: Az ilyen feladatokban, ahol különböző megfelelési szabályok kerülnek elő, amelyek befolyásolják, hogy mit írjunk ki, akkor a szabályoknak megfelelő reguláris kifejezést kell készítenünk. Mivel kihangsúlyozom, hogy bash scriptet kell írni, így ezekben a feladatokban közvetlenül nem írható awk script. Másrészt a paraméter átadást nem tanultuk awk esetében így ezért is nehéz lenne azzal megoldani. A reguláris kifejezések illesztésére a bashban az egrep parancsot tanultuk. Úgyhogy ezt kell használnunk a feladat megoldásához. Amit kiindulásképpen tudnunk kell az egrepről az az, hogy a sorok esetében tud illesztést vizsgálni. A példában viszont paraméterről kapjuk a dátumokat, amiket ugye a bash scriptünkben majd a $* változó nyomán tudjuk egy listában elérni. Ez a lista viszont egy szóközzel elválasztott lista, nekünk pedig olyan lista kell, amely soronként egy paramétert tartalmaz. Több különböző módon el lehet ezt érni. Viszont most csak a legegyszerűbb módszert fogom bemutatni: for ciklussal bejárjuk a paraméterek listáját és echoval kiírjuk a paramétert. echo $param Ha ezt kipróbálod láthatod, hogy soronként lett kiírva az összes paraméter. Ezután nincs más dolgunk, mint az echo parancsok kimenetét átirányítani egy egrepre, amely ugye kiírja azt a

szöveget, amit az echoval generáltunk, ha az általunk megadott szabály szerint megfelelő dátumformátumot tartalmaz. A következő lépés a reguláris kifejezés megadása. A ilyen feladatok fő részét ez képezi, tehát amennyiben csak a szabály egyes részeit tudod jól megadni, akkor is szerezhető részpontszám. Első lépésben próbáljunk meg az évszámra illesztést megadni. Gondoljuk végig milyen szabályt adhatunk meg erre? Első nekifutásra gondolhatunk arra, hogy olyan módon adjuk ezt meg, hogy az első két számjegy az lehet 9 vagy 20 és ezt 2 tetszőleges 0-9 szám kövessen: '(9 20)[0-9]2'. Ezzel az a probléma, hogy ilyen esetben 2099 is átmegy a szűrőn, ami viszont már nem elfogadható ebben a feladatban. Ilyen esetben úgy érdemes tovább bontani a szabályt, hogy a 2000-es évekre külön szabályt adunk meg és azt hozzá vagyoljuk az 900-as évekre vonatkozó szabállyal. Tehát olyan szabályunk lesz az évekre, hogy '9[0-9]2 20[0][0-9]'. Ezzel továbbra sem vagyunk készen, hiszen a 209 is beleesik az elfogadott évszámokba, ami pedig nem elfogadott a feladatban. Tehát amint láthatjuk a 2000-es éveket is tovább kell bontani. Az évekre vonatkozó szabály tehát a következő lesz: 9[0-9]2 200[0-9] 20[0-7] echo $param egrep 9[0-9]2 200[0-9] 20[0-7] A különböző részeket zárójeleznünk kell majd, mert a konkatenáció erősebb művelet a vagynál. Ezért az évszámra vonatkozó kifejezést zárójelbe tesszük. Ezután egy pont következik, ahol nagyon fontos odafigyelnünk arra, hogy a reguláris kifejezések linuxos jelölése esetén a pont az egy tetszőleges karaktert jelent, így jelölni kell, mint speciális karakter, amit hagyományos értelemben szeretnénk használni. Tehát \. echo $param egrep (9[0-9]2 200[0-9] 20[0-7])\. A következő lépés a hónap megadása. Itt az évszámhoz hasonló megfontolásokból a 0-val kezdődőekre és az -gyel kezdődőekre külön szabályt kell megadni és azokat vaggyal elválasztani. 0 esetében a második számjegy, ugye nem lehet 0 hiszen nincs 0. hónap. Az után pedig ugye csak 0,,2 jöhet, ugyanis a 2. az utolsó hónap. Ezeket is zárójelbe tesszük és egy ponttal folytatjuk. Tehát a reguláris kifejezés a következőképpen folytatódik: echo $param egrep (9[0-9]2 200[0-9] 20[0-7])\.(0[-9] [0-2])\. A nap szabálya lesz a következő lépés. Mivel engedményt tettünk így ez 0-3 között vehet fel értéket. Hasonlóan az előzőekhez külön szabályt kell alkotni, minden olyan első számjegyre, ami után nem 0-9-ig jöhet egy tetszőleges szám. Ilyen a 0, ugyanis azután nem jöhet újabb 0, és ilyen a 3, hiszen utána csak 0 és jöhet. Ezt is bezárójelezzük és a reguláris kifejezésünk így néz ki: (9[0-9]2 200[0-9] 20[0-7])\.(0[-9] [0-2])\.(0[-9] [2][0-9] 30 3)

Egyetlen utolsó simítás van még hátra. Ugyanis ez még elfogad olyan dátumokat, amelyek megfelelnek a fenti szabálynak, de utána vagy előtte egyéb karakterek vagy szöveg található. Az ilyen esetek általános kiküszöbölése az az, hogy megköveteljük, hogy a szabállyal kezdődjön és végződjön a sor. Ez esetben nem lehet más előtte vagy utána. Ezt ugye a sor elején ^, a sor végén pedig $ jelöljük. A végeredmény tehát: echo $param egrep "^(9[0-9]2 200[0-9] 20[0-7])\.(0[-9] [0-2])\. (0[-9] [2][0-9] 30 3)$" 2. feladat Írj AWK szkriptet, amely paraméterként egy fájlt vár. A fájl a következő formátumú sorokból áll: <ország>;<tájegység>;<kiinduló pont>;<célpont>; A feladat: Kiírni az országokat az őket érintő útvonalak kezdő és végpontjainak neveinek a felsorolásával. Majd egy üres sor kihagyását követően a tájegységeket kiírni az őket érintő útvonalak összhosszai alapján. Figyelj oda, hogy nem csak a példában bemutatott négy sorra, néhány tájra vagy néhány országra kell működnie, hanem tetszőleges hasonló felépítésű bemeneti fájlra.?> cat tajak.txt Magyarország;Börzsöny;Nagybörzsöny;Márianosztra;8 Románia;Kelemen-havasok;Maroshévíz;Pietros;25 Magyarország;Mátra;Gyöngyös;Mátraszentistván;23 Magyarország;Börzsöny;Diósjenő;Nagy-hideg-hegy;2?>./3_beapait.awk tajak.txt Országok Magyarország: Nagybörzsöny-Márianosztra Gyöngyös-Mátraszentistván Diósjenő-Nagy-hideg-hegy Románia: Maroshévíz-Pietros Tájegységek Börzsöny: 30 Kelemen-havasok: 25 Mátra: 23 Megoldás: A feladatban awk scriptet kell írnunk. Azokban a feladatokban, ahol több különböző dologhoz kapcsolódóan kell valamit összeszámolnunk, vagy szöveget összefűznünk, ott mindig tömbbel kell megoldanunk feladatot. Az, hogy létrehozunk országonként külön változót nem jó megoldás. Nyilván az sem jó megoldás, ha tájanként létrehozunk egyet. Tehát a tájaknak és az országoknak is külön tömböt kell létrehozunk. A tömböt az országok illetve a tájak neveivel kell majd indexelnünk. Tehát legyen egy orszagok tömb, amibe pl orszagok[ Magyarország ] vagy pl orszagok[ Románia ] címkét fogunk használni. Ehhez hasonlóan lesz egy tajak tömbünk. Mint minden awk feladatot ezt is azzal kell kezdenünk, hogy megvizsgáljuk a bemeneti állomány felépítését. Tehát, hogy az awk miként tudja majd ezt mezőkre bontani nekünk. Az alapértelmezett elválasztójel a szóköz, ehelyett itt viszont a pontosvessző az elválasztó jel. Tehát az FS változót át

kell állítanunk erre. Ezt pedig a BEGIN blokkban szokás elvégezni. BEGIN Ha ez megvan akkor a $ változóban fogjuk tudni minden sorban elérni az országot, $2 a tájegység, $3 a kiindulási pont, $4 az érkezési pont, $5 pedig az útvonal hossza. Gondoljuk végig azt, hogy mit kell összegyűjtenünk a feladatban. Országonként az útvonalak kezdő- és végpontjának a nevét. Ehhez a tömbértéknek szövegesnek kell lennie, amely tartalmazni fogja az említett mezők stringjeit kötőjellel illetve szóközzel elválasztva. A feladat tehát az, hogy minden sorban fűzzük hozzá az útvonal stringjét az eddig az országhoz eltárolt szöveghez. AWKban nem szükséges kezdőérték adása, alapból üres szövegről indulunk és első lépésben ahhoz fűzünk hozzá. Az összefűzés művelet a sima egymásmellé írással történik. BEGIN orszagok[$]=orszagok[$]""$3"-"$4" " Tehát, mivel nincs megadva semmilyen minta, ezért a most hozzáadott blokk minden sorra egyesével le fog futni. Soronként az orszagok tömböt a ország nevével indexeljük és az értéke, pedig a korábbi értékhez hozzáfűzött 3. és 4. mező tartalma lesz, tehát a kezdő- és a végpontja az útvonalnak egy kötőjellel elválasztva. A végére még hozzáfűzünk egy szóközt, hogy amennyiben lesz folytatás, akkor azt elválasszuk ezzel. A feladat második része a tájegységeken húzódó útvonalak összeszámolása. Tehát, amennyiben egy tájegységen több különböző útvonal is húzódik, akkor azoknak a hosszát kilométerben összegezzük a tömb tájegységhez tartozó indexe értékében. BEGIN orszagok[$]=orszagok[$]""$3"-"$4" " tajak[$2]+=$5 Tehát most a tájegység elnevezése lesz a tömb indexe, és így mindig az azonos tájegységhez tartozó km-eket összegezzük. A feladatból az van még hátra, hogy a végén kiírjuk az eredményeket. Ezt az END blokkban tudjuk megtenni és írnunk kell benne két for ciklust, amik külön-külön bejárják a két tömböt.

BEGIN orszagok[$]=orszagok[$]""$3"-"$4" " tajak[$2]+=$5 END print("országok") for(orszag in orszagok) print(orszag": "orszagok[orszag]) print("") print("tájegységek") for(taj in tajak) print(taj": "tajak[taj]) 3. feladat Írj AWK scriptet, ami összehasonlítja az egymás utáni sorokat és kiírja, hogy az előző sorhoz képest hány azonos pozíción lévő karakterben történt változás. Tehát kiírja a sorok közötti különbséget, 0 ha a két sor azonos. Az első sorban az üres sorhoz képesti változást írja ki, tehát a sor hosszát. Az üres karakterből karakterbe, vagy a karakterből üres karakterbe történő változás is változás.?>cat ism.txt abcdefghijklmnop bacdefghijklmnop bacdefghijklmnopq bacdefghijklmnopq qponmlkjhgfedcba qponmlkjhgfedcb qponmlkjhgfedc qponmlkjhgfed qponmlkjhgfe qpo qp q?>awk -f 3_beapait.awk ism.txt 6 2 0 7 9

Megoldás: Először értelmezzük a feladatot, és próbáljunk meg ötleteket gyűjteni azzal kapcsolatban, hogy lehetne ezt awkkal megoldani. A legelső megoldandó dolog az, hogy karakterenként tudjuk bejárni a sorokat. Ehhez módosítanunk kell, az elválasztójelet az üres stringre. Ekkor egy mező egy karakter lesz. BEGIN Ami a legfontosabb ennél a feladatnál, hogy valahogyan el kell tárolnunk az előző sort, ugyanis ahhoz képest kell összehasonlítani majd a jelenlegit. A változók, így a tömbök is, olyanok az awkban, hogy sorokon átívelően megőrzik a tartalmukat. Tehát semmi más dolgunk nem lesz, mint létrehozni egy elozosor tömböt, amelyben a mező indexe mentén helyezzük el a mezőértékeket. Ahhoz, hogy minden elemet megkapjunk egy for ciklussal be kell járnunk az adott sor összes mezőjét. BEGIN for(i=;i<=nf;i++) elozosor[i]=$i Ezek után elérhető lesz az előző sor tartalma a következő sorban. Kezdésnek az üres tömbhöz képest fogjuk megnézni, hogy mennyi változás történt. Ha történik változás, akkor növelünk egy valtozas változót. Fontos, hogy ezt azelőtt tegyük meg, mielőtt újra beállítanánk az előző sort. Mivel a változást soronként vizsgáljuk, ezért mindig le kell nullázni a valtozast még a sor elején. BEGIN valtozas=0 for(i=;i<=nf;i++) if(elozosor[i]!=$i) valtozas++ elozosor[i]=$i print(valtozas) Azt hihetnénk, hogy ezzel készen is vagyunk, de van benne még egy elég nagy hiba. Méghozzá az elozosor tömbünk, amennyiben egy hosszabb sort tartalmazott a jelenleginél a végén több sorral korábbról benne maradhatnak karakterek, amik hibát okoznak. Ahhoz, hogy ezt megoldjuk az előző sor mezőinek a számára (NF) van szükségünk a következő sorban. Ezt tároljuk el az elozonf

változóban. Ez alapján, ha az elozonf>nf, akkor indítani kell egy for ciklust NF+-től (ugyanis az NF-et már megvizsgáltuk) elozonf-ig és beállítani üres stringre (vagy 0-ra) az érintett indexeket. Ami még fontos, hogy ezek is változásnak számítanak, ezért a különbséget mindenképpen fel kell venni a valtozas változóban. BEGIN valtozas=0 for(i=;i<=nf;i++) if(elozosor[i]!=$i) valtozas++ elozosor[i]=$i if(elozonf>nf) for(i=nf+;i<=elozonf;i++) elozosor[i]="" valtozas++ print(valtozas) elozonf=nf