ARCHÍV!
A LEGFRISSEBB ANYAGÉRT KERESD FEL A "Teaching (in Hungarian)" MENÜPONTOT!
Operációs rendszerek gyakorlat 2018-2019/2
• Részteljesítések, pontszerzési lehetőségek: 2 zárthelyi dolgozat, 5 db órai feladat. • Első zárthelyi dolgozat: A 7-ik szorgalmi héten (március 18-tól kezdődő hét) • Második zárthelyi dolgozat: a 14-ik szorgalmi héten (május 6-tól kezdődő hét) • A zárthelyi dolgozat időpontja előre rögzített, nem változtatható, kizárólag indokolt esetben pótolható (megfelelő igazolással). A zárthelyi dolgozatokra 20-20, az órai kis feladatokra összesen 10 pontot lehet szerezni. A zárthelyi feladatok megoldásához csak a helyszínen biztosított elektronikus segédanyag használható. • A zárthelyi dolgozatra szerezhető pontokon felül opcionális lehetőség van plusz pontok szerzésére órai feladatok megoldásával. A feladatok kitűzésének időpontjai nem lesznek előre bejelentve Mindegyik kis feladat helyes megoldása 2 pontot ér (részpontszám adható) A feladatok megoldása nem kötelező A feladatokat egyénileg kell megoldani 10 perc alatt A feladatok megoldásához használhatóak a /pub könyvtárban lévő elektronikus anyagok A megoldott feladatokat a gyakorlatvezetők értékelik ki • A zárthelyi dolgozatok és az órai kis feladatok megoldására kapott pontok összege alapján történik a gyakorlati jegy megállapítása, de ennek összege nem lehet nagyobb a két zárthelyi dolgozatra szerezhető összpontszámnál: 0-19 pont: elégtelen (1) 20-24 pont: elégséges (2) 25-29 pont: közepes (3) 30-34 pont: jó (4) 35- pont: jeles (5) • Sikertelen gyakorlati teljesítés (elégtelen gyakorlati jegy) javítása javító zh megírásával lehetséges. Javító zh megírására az a hallgató jogosult, aki a szorgalmi időszakbeli részteljesítései alapján elégtelen gyakorlati jegyet szerzett és mindkét zárthelyi dolgozatot megírta. A javító zh feladatai a teljes félév gyakorlati anyagát lefedik. A javító zh megoldásához csak a helyszínen biztosított elektronikus segédanyag használható. A javító zh-n 20 pont szerezhető. A javítás akkor sikeres, ha a hallgató a javító zh-n legalább 10 pontot szerez. Sikeres javítás esetén elégséges (2) gyakorlati jegy kerül megállapításra. Ennél jobb jegy még magasabb pontszám esetén sem adható. A javító zh megírására, később meghatározandó időpontban kerül majd sor.
• Linux bevezetés, parancsok, parancsok szöveges fájlokra, csővezetékek, átirányítások, jogosultságkezelés, felhasználók kezelése, linkelés, környezeti változók, szűrők • BASH script programozás, alapok, változók, paraméter kezelés, vezérlési szerkezetek, 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
L1. Bevezetés I., fájlrendszerek, linux hálózatok (+ kiegészítő év eleji szentbeszéd Lékó módra)
L2. Bevezetés II., fájlműveletek, szöveges fájlok feldolgozása, átirányítások
L3. Bevezetés III., mintaillesztés, felhasználók kezelése, linkelés, jogosultságkezelés, keresés
B1. BASH script programozás I., alapok, változók, hivatkozások, paraméter kezelés
B2. BASH script programozás II., vezérlési szerkezetek I. (if, for)
B3. BASH script programozás III., vezérlési szerkezetek II. (while, do-until, case), függvények, exit állapot, break, continue
1. zh (20p)
A1. Reguláris kifejezések, AWK programozás I. - bevezető, felépítés, minták
A2. AWK programozás II. változók, vezérlési szerkezetek
A3. AWK programozás III.
2. zh (20p)
Javító/Pótló ZH
1. hét - 02.04. - 02.07. - H / K / SZ / CS L1
2. hét - 02.11. - 02.14. - H / K / SZ / CS L2
3. hét - 02.18. - 02.21. - H / K / SZ / CS L3
4. hét - 02.25. - 02.28. - H / K / SZ / CS B1
5. hét - 03.04. - 03.07. - H / K / SZ / CS B2
6. hét - 03.11. - 03.14. - H / K / SZ / CS B3
7. hét - 03.18. - 03.21. - H / K / SZ / CS 1. zh (20p)
_. hét - 03.25. - 03.28. - TAVASZI SZÜNET
8. hét - 04.01. - 04.04. - H / K / SZ / CS A1
9. hét - 04.08. - 04.11. - H / K / SZ / CS A2
10. hét - 04.15. - 04.18. - H / K / SZ / CS A3
11. hét - 04.22. - 04.25. - H elmarad (HÚSVÉT) / K / SZ gyakorlás / CS elmarad (SPORTNAP)
12. hét - 04.29. - 05.02. - H / K / CS gyakorlás / SZ elmarad
13. hét - 05.06. - 05.09. - H / K / SZ / CS 2. zh (20p)
14. hét - 05.13. - 05.16. - H / K / SZ / CS Javító ZH - Közös időpontban írja mindenki (később kerül meghatározásra), NEM a saját gyakorlatának időpontjában és helyén!
L1
Követelmények ismertetése
A gyakorlati követelmények megtekinthetőek lesznek a félév folyamán itt a honlapomon (Követelmények fül) és CooSpace-en is.
Egyéb hasznos információk
A gyakorlat anyaga elérhető lesz a honlapomon.
Kurzusfórumnak a CooSpace-t fogjuk használni. A ZH-k pontszámai is CooSpace-re fognak felkerülni.
Ha valakinek kérdése van az anyaggal kapcsolatban óra előtt/közben/után (tehát BÁRMIKOR) nyugodtan lehet kérdezni, vagy közölni ami az órával kapcsolatos. Nyugodtan szakítsatok félbe (a lényeg, hogy ne fájjon) és megbeszéljük.
Emellett email-ben is állok rendelkezésetekre ( leko@inf.u-szeged.hu ). Igyekszem minden email-re még az érkezése napján reagálni, legkésőbb az esti órákban. Ha nem válaszolok egy napon belül, nyugodtan írjatok rám mégegyszer. A küldött email tárgya az alábbi formájú legyen: [os] ( Ez nagyon fontos az email-ek kategorizálásakor, kérem mindenki tartsa be! ).
Ha valaki szeretne jönni fogadóórára, várom sok szeretettel, csak jelezze email-ben legkésőbb előző nap (ha túdjátok lehet előbb), hogy szeretne jönni. Majd egyeztetünk időpontot.
Társoktatók elérhetőségei:
- Manz Günter, magun@inf.u-szeged.hu. Tisza Lajos krt. 103. 107-es szoba. Fogadóóra: egyeztetés szerint
- Berta Árpád, berta@inf.u-szeged.hu. Tisza Lajos krt. 103. 45/A szoba. Fogadóóra: egyeztetés szerint
- Varga László, vargalg@inf.u-szeged.hu. Árpád tér 2. 218-as szoba. Fogadóóra: csütörtök 10:00 - 11:00
"Megmondom a véleményem" rovat. Anonim véleménynyílvánítás félév közben. Nem a félév végi hallgatói véleményezést helyettesíti, csupán lehetőséget nyújt a hallgatók számára, hogy félév közben is jelezni tudják észrevételeiket, kéréseiket, panaszaikat, ... ezzel is hozzájárulva, hogy minél inkább a TI, és ne az én elképzeléseim formálják az órákat. Várok minden nemű, építő jellegő kritikát! (U.i. Lécci ne SPAMeljétek tele. Köszi!)
Motiváció
- Az informatikai cégek jelentős részénél a fejlesztések valamilyen Linux operációs rendszer alatt zajlanak, így mindeki jól jár azzal, ha ismeri ezeknek a rendszereknek a felépítését és használatát.
- A script nyelvek egyre inkább kezdenek visszatérni a porondra, ennek megfelelően a BASH script ismerete egy jó alap lehet a későbbiekben ha valaki mondjuk Matlab-ban vagy Python, Javascript, Perl, Ruby, ... nyelven szeretne programozni. Sőt még a PHP is ebbe a kategóriába tartozik.
- Könnyed keresés és listázás fájlok között illetve fájlokban keresés és testre szabott adatkiválogatás.
- Linux alatt a programok telepítése egy parancs kiadását jelenti az ún. csomagkezelőnek köszönhetően. Így nem kell egy program telepítésekor a függőségeket kézzel megkeresni és telepíteni; automatikus, egységes és biztonságos frissítési mechanizmust biztosítanak; a feltelepített csomagok listája elmentésével egyszerűíen és automatikusan reprodukálható egy működő rendszer.
- Többfelhasználós rendszer - jogosultságok.
- BASH: több linux parancs egymási utáni végrehajtása.
- Miért AWK? Egyszerű és rövid feladatok megírására felesleges magas szintű programozási nyelveket használi. Szinte bárhol elérhető és mindig ugyanúgy működik.
- ...
- EXTRA: mire lehet még jó a BASH: link.
Egy friss (2018) tanulmány (link) szerint ez az a 10 programozási nyelv, amit valószínűleg leginkább megérné megtanulni 2018-ban:
1. JavaScript 2. Python 3. C# 4. Java 5. PHP 6. Go 7. Swift 8. Rust 9. Kotlin 10. C & C++
kernel vs. shell
A kernel alapvető központja minden operációs rendszernek. A mag (core), amely alapvető szolgáltatásokat nyújt az operációs rendszer minden részének és kommunikál a hardverrel ún. rendszerhívásokkal (system call).
Ezzel szemben a shell az operációs rendszer legkülső része, mely a felhasználókkal való kommunkiációra szolgál, felhasználói parancsokkal. A shell-nek több típusa is van. Az egyik legelterjedtebb a BASH shell (Bourne Again SHell), ezt fogjuk használni mi is.
Linux otthonra
1. Debian (az ez alatti linkeken belül szerepel, hogy melyiket ajánlott letölteni), Ubuntu és VirtualBox letöltési lehetőség.
Debian telepítés leírása (általános) itt .
Debian telepítés VirtualBox-ra leírása (64 bit!) itt (YouTube) . (EZT AJÁNLOM. Részletes, érthető és jól működik - tesztelve)
2. Windows alatt (Más, mint a ZH környezet, úgyhogy csak óvatosan. Megj.: én is ezt használom.) :
3. Kabinet elérése:
WinSCP - Adatmozgatás a kabinetes szerverről/szerverre otthonról könnyedén.
PUTTY - Otthonról való bejelentkezés a kabinetes szerverre.
Kabinet elereséhez részletes leírás itt .
4. Üljünk be a kabinetbe gyakorolni! Szinte minden órában van üres terem, melybe bárki beülhet és használhatja a gépeket gyakorlásra.
Referencia
A félévben áttárgyalásra kerülő tananyag jelentős alapját az alábbi jegyzet képezi:
- Griechisch Erika jegyzete: link. Ez a jegyzet a ZH-k alatt is elérhető és használható lesz!
- Gyakorláshoz a hozzá tartozó példatár: link.
A weboldalon fellelhető LINUX anyag fő forrásai: itt és itt .
További hasznos tutoriálok és leírások elérhetők YouTube-on, illetve Google barátunk segítségével még több hasznos dolgot túrhatunk elő tanulmányaink előbre segítésére az internet sötét bugyraiból.
Fájlrendszer
<parancs> --help
pwd
Bármelyik parancs után írva kiad nekünk a terminál egy kis segítséget az adott parancs használatáról.
(print working directory)
Aktuális könyvtár elérési útvonala. Bármikor kiadhatod ezt a parancsot, eredményként megkapod, hogy pontosan "hol" is vagy.
lekogabi@lekogabi:~/Letöltések/eclipse$ pwd /home/lekogabi/Letöltések/eclipse
history
Kiírja a terminal előzményeket.
ls
*(list)
Ez a parancs megmutatja az aktuális könyvtárban tálalható fájlok neveit. A lista alapértelmezés szerint abc sorrendben sorolja fel a neveket, de alkalmas kapcsolók segítségével más sorrendet is elõírhatunk. pl.:
lekogabi@lekogabi:~/Letöltések/eclipse$ ls
Eredményként kiíratódik a terminálban az 'eclipse' mappa tartalma.
Kapcsolók:
-1: oszlopokban mutatja a fájlok adatait
-l: oszlopokban, részletesen mutatja a fájlok adatait
-d <könyvtár>: csak az adott könyvtár adatait írja ki. (Használjuk a "-l" kapcsolót is.)
-a: a rejtett fájlokat is mutatja
-R: könyvtáron belüli könyvtárak tartalmát is listázza
-r: forditott sorrendben listáz
-h: "barátságosabb" formában listázza ki a számokat
A kapcsolókat lehet kombinálva is használni, igy pl.:
lekogabi@lekogabi:~/Letöltések/eclipse$ ls -l -a -r lekogabi@lekogabi:~/Letöltések/eclipse$ ls -lar
Mindkét parancs kifogja listázni oszlopokba rendezve (-l), részletes adatokkal a rejtett fájlokat (-a) is, forditott sorrendben (-r).
cd <none, könyvtár, könyvtárszerkezet>
*(change directory)
A könyvtár rendszerben való mozgást teszi lehetõvé. Paraméterként a megcélzott könyvtár nevét kell megadni, vagy abszolút, vagy relatív elérési útvonal használatával.
Abszolút elérési útvonal megadásánál a keresett könyvtár teljes elérési útvonalát kell megadni. Tehát rootból indulva pl.: /home/hxxxxxx/mappa/file1 .
Relatív címzés esetén azt mondjuk csak meg, hogy az aktuális könyvtárhoz képest hol helyezkedik el a megcélzott könyvtár. Tehát aktuális könyvtárból indulva pl.: ha éppen a /home/hxxxxxx-ben vagyunk: ./mappa/file1 .
aktuális könyvtár: .
szülőkönyvtár: ..
További példák:
Abszolút címzés:
lekogabi@lekogabi:~$ lekogabi@lekogabi:~$ cd /home/lekogabi/Letöltések/eclipse lekogabi@lekogabi:~/Letöltések/eclipse$
Relatív címzés:
lekogabi@lekogabi:~$ lekogabi@lekogabi:~$ cd Letöltések/eclipse/ lekogabi@lekogabi:~/Letöltések/eclipse$
Visszalépés a szülő könyvtárba:
lekogabi@lekogabi:~/Letöltések/eclipse$ cd .. lekogabi@lekogabi:~/Letöltések$ cd .. lekogabi@lekogabi:~$vagy
lekogabi@lekogabi:~/Letöltések/eclipse$ cd ../.. lekogabi@lekogabi:~$
A cd parnacs önmagában visszadob a hxxxxxx könyvtárba.
lekogabi@lekogabi:~/Letöltések/eclipse$ cd lekogabi@lekogabi:~$
"~": a home könyvtár elérési útvonalát tárolja.
lekogabi@lekogabi:~/Letöltések/eclipse$ cd ~ lekogabi@lekogabi:~$
Linux hálózatok
scp <felhasználónév>@<szerver>:<távoli útvonal><helyi útvonal>
Átmásol egy bizonyos fájlt vagy könyvtárat a "távoli útvonal"-ról a "helyi útvonal"-ra, vagy vissza. pl.:
lekogabi@lekogabi:~$ scp h165057@linux.inf.u-szeged.hu:/n/pub/ProgramozasAlapjai/Gyakorlat/gyak02/anyag.txt ./ h165057@linux.inf.u-szeged.hu's password: anyag.txt 100% 3659 3.6KB/s 00:01
ssh [kapcsoló]<felhasználónév>@<szerver>
Csatlakozni lehet a szerverre, futtatni konzolos programokat.
-X: Ezzel a kapcsolóval grafikus programot is indíthatunk.
pl.:
lekogabi@lekogabi:~$ ssh h165057@linux.inf.u-szeged.hu h165057@linux.inf.u-szeged.hu's password: Linux linux1.inf.u-szeged.hu 3.2.0-4-686-pae #1 SMP Debian 3.2.54-2 i686 ****************************************************************************** * Udvozoljuk az Informatikai Tanszekcsoport linux szerveren! * * * * A szerver azt a celt szolgalja, hogy tavoli bejelentkezes eseten ugyanazt * * a kornyezetet biztositsa, amit egy tanteremben levo munkaallomas biztosit. * * * * A szerver mukodesevel, a bejelentkezessel kapcsolatos problemaikat kerjuk * * a kabinet@inf.u-szeged.hu cimen jelezzek. * ****************************************************************************** Last login: Sun May 4 21:38:49 2014 from 79.101.5.52 h165057@linux1:~$ cd LekoGabor h165057@linux1:~/LekoGabor$ make make: Nothing to be done for `application'. h165057@linux1:~/LekoGabor$ ./LekoGabor freeglut (./LekoGabor): failed to open display '' h165057@linux1:~/LekoGabor$ exit kijelentkezés Connection to linux.inf.u-szeged.hu closed. lekogabi@lekogabi:~$ ssh -X h165057@linux.inf.u-szeged.hu h165057@linux.inf.u-szeged.hu's password: Linux linux1.inf.u-szeged.hu 3.2.0-4-686-pae #1 SMP Debian 3.2.54-2 i686 ****************************************************************************** * Udvozoljuk az Informatikai Tanszekcsoport linux szerveren! * * * * A szerver azt a celt szolgalja, hogy tavoli bejelentkezes eseten ugyanazt * * a kornyezetet biztositsa, amit egy tanteremben levo munkaallomas biztosit. * * * * A szerver mukodesevel, a bejelentkezessel kapcsolatos problemaikat kerjuk * * a kabinet@inf.u-szeged.hu cimen jelezzek. * ****************************************************************************** Last login: Wed Aug 13 21:12:17 2014 from 79.101.5.234 h165057@linux1:~$ cd LekoGabor/ h165057@linux1:~/LekoGabor$ make make: Nothing to be done for `application'. h165057@linux1:~/LekoGabor$ ./LekoGabor > /dev/null
sftp <felhasználónév>@<szerver>
Csatlakozik a szerverre és lehetőségünk van lépkedni a szerver könyvtáraiban, illetve a lokális könyvtárunkban, majd leszedni illetve feltölteni bizonyos adatokat.
Egy 'l' betű hozzáadásával tudjuk közölni a géppel, hogy nem a szerveren szeretnék, hogy végrehajtódjon az adott parancs, hanem a lokális gépen. pl.:
ls - lls, pwd - lpwd, cd - lcd, mkdir - lmkdir.
put - fájl átmásolása a lokális gépről a szerver gépre.
get - fájl átmásolása a szerver gépről a lokális gépre.
exit - kilép a szerverről.
pl.:
lekogabi@lekogabi:~$ sftp h165057@linux.inf.u-szeged.hu h165057@linux.inf.u-szeged.hu's password: Connected to linux.inf.u-szeged.hu. sftp> cd ../.. sftp> cd pub/ProgramozasAlapjai/Gyakorlat/gyak02/ sftp> get anyag.txt Fetching /n/pub/ProgramozasAlapjai/Gyakorlat/gyak02/anyag.txt to anyag.txt /n/pub/ProgramozasAlapjai/Gyakorlat/gyak02/an 100% 306 0.3KB/s 00:00 sftp> exit lekogabi@lekogabi:~$
L2
Fájlműveletek
touch <fájl>
*
Bármilyen fájlt létrehozhatunk vele:
lekogabi@lekogabi:~/Dokumentumok/seged$ ls lekogabi@lekogabi:~/Dokumentumok/seged$ touch akarmi lekogabi@lekogabi:~/Dokumentumok/seged$ touch vmi.txt lekogabi@lekogabi:~/Dokumentumok/seged$ ls akarmi vmi.txt
mkdir [kapcsoló]<új mappa>
(make directory)
Új könyvtár létrehozására (csak az adott könyvtárban). pl.:
lekogabi@lekogabi:~/Dokumentumok$ mkdir hello
Létrejön egy "hello" nevű mappa a 'Dokumentumok'-on belül.
Kapcsolók:
-p: Létrehozza a kívánt könyvtár eléréséig az összes szükséges könyvtárat. pl.:
lekogabi@lekogabi:~/Dokumentumok$ mkdir -p hello/hello2/hello3
Végig létrehozza a könyvtárszerkezetet.
-m: Megadhatjuk az új katalógus hozzáférési jogát oktálisan a "mode" értékének beállításával. pl.:
lekogabi@lekogabi:~/Dokumentumok/hello$ mkdir -m 777 hello2 lekogabi@lekogabi:~/Dokumentumok/hello$ ls -l drwxrwxrwx 2 lekogabi lekogabi 4096 aug 5 17:05 hello2
A '777' megadásával teljeskörű jogokat biztosítunk mindhárom felhasználói csoportnak (user, group, other). A 3 db 7-es számjegy egyenkénti csökkentésével (0-7) lehet egyre kisebb jogokkal felruházni a felhasználói csoportokat.
Az elérési jogok megváltoztatásáról/értelmezéséről részletesen a "Fájlkezelés" alfejezet végén (chmod).
rmdir [kapcsoló]<törlendő mappa>
(remove directory)
Könyvtárak törlésére szolgáló parancs. Az rmdir parancs csak üres könyvtárat vagy könyvtárakat töröl. pl.:
lekogabi@lekogabi:~/Dokumentumok$ mkdir hello lekogabi@lekogabi:~/Dokumentumok$ rmdir hello
Eredményül kitörlődik a 'hello' nevű mappa.
Kapcsolók:
-p: A könyvtár törlése után, a szülõ könyvtárat is törli, ha üres, rekurzívan.
A Dokumentumok mappán belül található egy hello nevű mappa és azon belül egy hello2 nevű mappa. Ha az aktuális könyvtár a Dokumentumok, akkor a -p kapcsoló segítségével, ha kitöröljük a hello2 mappát, akkor a hello mappa is törlődni fog (mivel nem tartalmaz mást).
lekogabi@lekogabi:~/Dokumentumok$ mkdir -p hello/hello2 lekogabi@lekogabi:~/Dokumentumok$ rmdir -p hello/hello2
rm [kapcsoló]<törlendő fájl(ok)>
(remove)
Kitörli az rm parancs után található fájlokat (könyvtárakat nem, arra az rmdir használandó, kivéve kapcsoló hozzáadásával - lásd lentebb). pl.:
lekogabi@lekogabi:~/Dokumentumok$ rm file1.txt file2.txt
Eredményül a file1.txt és a file2.txt törlésre kerül.
Kapcsolók:
-f: sosem kérdez.
-i: kétes esetben kérdez.
-r: könyvtár törlésére, akkor is törli ha nem üres!
-R: -//-
lekogabi@lekogabi:~/Dokumentumok$ ls elso lekogabi@lekogabi:~/Dokumentumok$ cd elso/masodik lekogabi@lekogabi:~/Dokumentumok/elso/masodik$ ls t.txt lekogabi@lekogabi:~/Dokumentumok/elso/masodik$ cd ../.. lekogabi@lekogabi:~/Dokumentumok$ rm -r elso lekogabi@lekogabi:~/Dokumentumok$ ls lekogabi@lekogabi:~/Dokumentumok$
Kitörlésre kerül az elso/masodik mapparendszer, annak ellenére, hogy nem üres.
mv [kapcsoló]<forrás><cél>
(move)
A fájlok állományrendszeren belüli mozgatására szolgáló parancs. Ha nem adunk meg fájlnevet a célnál, akkor nem változik meg a neve, különben a megadott fájlnév lesz a célkönyvtárban. pl.:
lekogabi@lekogabi:~/Dokumentumok$ mv hello /home/lekogabi/Letöltések
Eredményül a 'hello' nevű fájl átkerül a Dokumentumok könyvtárból a Letöltések könyvtárba.
Kapcsolók:
-b: biztonsági másolatot készít a forrásfájlról.
-f: sosem kérdez felülírásnál.
-i: kétes esetben kérdez (pl. névütközés...).
-u: csak régebbit ír felül.
cp [kapcsoló]<forrás><cél>
(copy)
Átmásolja a forrás fájlt a megadott helyre. pl.:
lekogabi@lekogabi:~/Letöltések$ cp image.png /home/lekogabi/Dokumentumok
Eredményül átmásolja a 'image.png' fájlt a Letöltések könyvtárból a Dokumentumok könyvtárba.
Kapcsolók:
-r: könyvtár egész tartalmának másolása.
-R: -//-
-b: minden célfájlról mentés.
-f: sosem kérdez.
-i: kétes esetben kérdez.
-u: csak régebbit írja felül.
-l: linkelés másolás helyett.
-s: szimbólikus linket készít.
cat <fájl>
*Paraméter nélkül írhatunk a képernyőre és Enter leütése után kiírja az addig beírt sort. Fájl paraméter esetén kiírja a fájl tartalmát a képernyőre. Ha "cat > szövegfájl" kombinációt használjuk, akkor a konzolra írt sorokat a szövegfájlba menti, ha >>-t írunk > helyett, akkor pedig a sorokat hozzáfűzi a fájl végéhez. pl.:
lekogabi@lekogabi:~/Dokumentumok$ cat hello hello ^C lekogabi@lekogabi:~/Dokumentumok$ cat > file.txt first ^C lekogabi@lekogabi:~/Dokumentumok$ cat file.txt first lekogabi@lekogabi:~/Dokumentumok$ cat >> file.txt second ^C lekogabi@lekogabi:~/Dokumentumok$ cat file.txt first second
Először kiírtuk a képernyőre, hogy "hello", majd a 'file.txt'-be bele írtuk a "first" sort. Aztán ezt kiírattuk a képernyőre, majd hozzáfűztük ugyanehhez a fájlhoz a "second" sort és kiírattuk.
Szövegfájlok
echo
*
Az utána lévő szöveget írja ki a képernyőre. A szóközöket a "\<szóköz>" segítségével lehet beszúrni. Vagy ha az egész szöveget "" közé tesszük, akkor az kerül a képernyőre ami az "" között van. pl.:
lekogabi@lekogabi:~$ echo hello hello lekogabi@lekogabi:~$ echo "hello Kitty!" hello Kitty!
more
A fájl tartalmát oldalanként írja ki a képernyőre és mindig a terminal alján látható, hogy a fájl hány százalékát néztük át az adott sorig. ('Space' leütésével lehet léptetni.)
less
Hasonló, mint a more, csak nincs % jelzés a terminal allján. Fontos: 'q' lenyomásával lehet kilépni a nézetből.
head [kapcsoló]<fájl>
*Kiírja a fájl a bizonyos sorait a képernyőre.
Kapcsolók:
-n <-szám>: kiírja a file tartalmát, kivéve az utolsó "szám" mennyiségű sort.
-szám: az első "szám" számú sort írja ki
tail [kapcsoló]<fájl>
*Kiírja a fájl a bizonyos sorait a képernyőre.
-n <+szám>: a "szám"-adik sortól kezdve ír ki.
-szám: az utólsó "szám" számú sort írja ki
-f: folyamatosan bővülő fájl tartalmát írja ki.
head, tail és head|tail pl.:
lekogabi@lekogabi:~/Dokumentumok$ cat file2.txt elso masodik harmadik negyedik otodik hatodik hetedik nyolcadik kilencedik tizedik lekogabi@lekogabi:~/Dokumentumok$ head -4 file2.txt elso masodik harmadik negyedik lekogabi@lekogabi:~/Dokumentumok$ tail -2 file2.txt kilencedik tizedik lekogabi@lekogabi:~/Dokumentumok$ head -9 file2.txt | tail -3 hetedik nyolcadik kilencedik
sort
*A sorokat abc sorrendbe rendezetten írja ki a sorkezdő karakter alapján.
-n: számok alapján rendez.
lekogabi@lekogabi:~/Dokumentumok$ cat file2.txt elso masodik harmadik negyedik otodik hatodik hetedik nyolcadik kilencedik tizedik lekogabi@lekogabi:~/Dokumentumok$ sort file2.txt elso harmadik hatodik hetedik kilencedik masodik negyedik nyolcadik otodik tizedik
uniq
*Egymás után ismétlődő sorokat egyszer írja ki.
lekogabi@lekogabi:~/Dokumentumok$ cat > file2.txt geza bela bela jonas bela lekogabi@lekogabi:~/Dokumentumok$ uniq file2.txt geza bela jonas bela
tr
*Karakterek lecserélése, tömörítése és/vagy törlése.
Például az alábbi parancs nagybetűsíti a megadott szöveget:
lekogabi@lekogabi:~/Dokumentumok$ echo "Programozas Alapjai" | tr a-z A-Z PROGRAMOZAS ALAPJAI
tee
*A tee parancs a standard bemenetén kapott adatokat a standard kimenetre és valamennyi argumentumként kapott fájlba másolja. Ez akkor hasznos, ha az adatokat nemcsak a csővezetéken szeretnénk továbbítani, hanem szükségünk van egy másolatra is.
Példa: Mi van akkor, ha az előző példa esetén nem csak nagybetűsíteni szeretnénk egy adott szöveget, hanem egy fájl tartalmát szeretnénk nagybetűsíteni, majd vissza is írni az eredményt ebbe a fájlba?
lekogabi@lekogabi:~/Dokumentumok$ cat > file2.txt Elmentunk nyaralni. lekogabi@lekogabi:~/Dokumentumok$ cat file2.txt | tr a-z A-Z ELMENTUNK NYARALNI. lekogabi@lekogabi:~/Dokumentumok$ cat file2.txt | tr a-z A-Z | tee file2.txt ELMENTUNK NYARALNI. lekogabi@lekogabi:~/Dokumentumok$ cat file2.txt ELMENTUNK NYARALNI.
cut
*Sorok kiválasztott részeit írja ki.
Legsűrűbben előforduló használata:
cut -d <ELVÁLASZTÓ> -f <MEZŐLISTA> <FÁJL>
lekogabi@lekogabi:~/Dokumentumok$ cat matrix.txt 11 12 13 14 15 21 22 23 24 25 31 32 33 34 35 lekogabi@lekogabi:~/Dokumentumok$ cat matrix.txt | cut -d " " -f 2 12 22 32 lekogabi@lekogabi:~/Dokumentumok$ cat matrix.txt | cut -d " " -f 4-5 14 15 24 25 34 35
wc [kapcsoló]<fájl>
*Kiírja a fájl sorainak a számát, szavainak a számát, a byte-ok számát és a fájl nevét.
Kapcsolók:
-l: csak a nevet és a sorok számát írja ki.
-w: csak a nevet és a szavak számát írja ki.
-c: csak a nevet és a byte-ok számát írja ki.
-m: csak a nevet és a betűk számát írja ki.
pl.:
lekogabi@lekogabi:~/Dokumentumok$ wc file2.txt 10 10 83 file2.txt lekogabi@lekogabi:~/Dokumentumok$ wc -l file2.txt 10 file2.txt
/dev/null
Egy speciális fájl, amely minden beleírt adatot töröl, miközben az írasi művelet sikeres. Az eszközből való olvasás nem ad vissza semmilyen adatot, eredménye azonnali EOF, azaz fájl vége. Felfogható adatnyelő eszközként ("fekete lyuk"). A null eszközt tipikusan folyamatok kimeneti stream-jeinek eltüntetésére használják, vagy az üres bemenet biztosítására, általában átirányítás segítségével. pl.: OpenGL: ./LekoGabor > /dev/null
Visszatérve a nagybetűsítő példához: bővítsük annyival, hogy most ne írjunk a terminálba semmit, csak a fájlba írás történjen meg, kvázi ne szemeteljük össze a terminált.
lekogabi@lekogabi:~/Dokumentumok$ cat > file2.txt Elmentunk nyaralni. lekogabi@lekogabi:~/Dokumentumok$ cat file2.txt | tr a-z A-Z | tee file2.txt >> /dev/null lekogabi@lekogabi:~/Dokumentumok$ cat file2.txt ELMENTUNK NYARALNI.
Beépített környezeti változók:
$PWD: Tárolja az aktuális elérési útvonalat.
$HOME: Tárolja a home könyvtár abszolút elérési útvonalát.
$PS1: A prompt kinézetét leíró kifejezést tárolja.
$PATH: A keresési könyvtárak elérési útvonalát tárolja, itt keresi a parancsokat.
~: Nem környezeti változó, de a home könyvtár elérési útvonalát tárolja.
Átirányítások és parancsok láncolása
parancs > szövegfájl
*
A parancs kimenete a konzol helyett a fájlba fog íródni, a fájl addigi tartalma elvész. pl.:
lekogabi@lekogabi:~/Dokumentumok$ ls -l > file.txt lekogabi@lekogabi:~/Dokumentumok$ cat file.txt -rw-r--r-- 1 lekogabi lekogabi 83 aug 9 21:01 file2.txt -rw-r--r-- 1 lekogabi lekogabi 0 aug 13 19:10 file.txt drwxr-xrwx 2 lekogabi lekogabi 4096 aug 9 15:07 hello -rw-r--r-- 1 lekogabi lekogabi 15796 aug 13 19:09 progalap_linux
A standard bemenet (stdin), kimenet (stdout) és hibacsatornára is lehet hivatkozni, rendre a 0, 1 és 2 számokkal.
A standard kimenetet állítsuk a "semmibe". Röviden: ha a standard kimenet eddig a képernyőre volt állítva, akkor most nem fogunk kiíratáskor látni semmit:
lekogabi@lekogabi:~/Dokumentumok$ 2>/dev/null
Az stderr-t ugyanoda irányítjuk, ahová a stdout irányítva lett:
lekogabi@lekogabi:~/Dokumentumok$ 2>&1
parancs >> szövegfájl
*A parancs kimenete a konzol helyett a szövegfájl végéhez fog hozzáfűződni. pl.:
lekogabi@lekogabi:~/Dokumentumok$ ls >> file.txt lekogabi@lekogabi:~/Dokumentumok$ cat file.txt -rw-r--r-- 1 lekogabi lekogabi 83 aug 9 21:01 file2.txt -rw-r--r-- 1 lekogabi lekogabi 0 aug 13 19:10 file.txt drwxr-xrwx 2 lekogabi lekogabi 4096 aug 9 15:07 hello -rw-r--r-- 1 lekogabi lekogabi 15796 aug 13 19:09 progalap_linux file2.txt file.txt hello progalap_linux
parancs < szövegfájl
A parancs bemeneteként kapja a szövegfájl tartalmát.
parancs1 | parancs2
*U.n. csővezeték vagy pipeline (!).
A parancs1 kimenete konzolra kiírás helyett a parancs2 bemenete lesz. pl.:
lekogabi@lekogabi:~/Dokumentumok$ cat file2.txt elso masodik harmadik negyedik otodik hatodik hetedik nyolcadik kilencedik tizedik lekogabi@lekogabi:~/Dokumentumok$ head -9 file2.txt | tail -3 hetedik nyolcadik kilencedik
parancs1;parancs2;parancs3
A parancsok ";"-vel elválasztva egymás után hajtódnak végre balról jobbra.
lekogabi@lekogabi:~/Dokumentumok$ mkdir ujmappa; cd ujmappa; ls -l összesen 0 lekogabi@lekogabi:~/Dokumentumok/ujmappa$
L3
Mintaillesztés *
Ha nem tudjuk egy szöveg pontos alakját, csak egy részét, vagy több szövegrészlettel szeretnénk egyszerre dolgozni, akkor jön jól a mintaillesztés. Használható pl. egyszerre több fájl törlésénél, vagy keresésnél (fájlban, vagy fájlrendszerben).
Speciális karakterek:
? - pontosan egy karaktert helyettesít: pl. ?lma lehet alma vagy álma is így.
* - bármennyi (akár 0) karaktert helyettesít: pl. *gép lehet gép, mosógép, számítógép, stb.
[...] - a [] között felsorolt karakterekből pontosan egyet helyettesít: pl. [aó]lom lehet ólom vagy alom, fajl[0123456789] pedig fajl0, fajl1, ... fajl9.
[^...] - pontosan egy karaktert helyettesít, mely nem lehet a [] között felsorolt karakterek egyike sem.
pl.:
Az összes .txt végződésű fájl kilistázása:
lekogabi@lekogabi:~$ ls *.txt
Minden .png fájl átmásolása a Dokumentumok/hello mappába:
lekogabi@lekogabi:~$ cp *.png /home/lekogabi/Dokumentumok/hello
Az összes .png kép törlése a Dokumentumok/hello mappából:
lekogabi@lekogabi:~/Dokumentumok/hello$ rm *.png
Olyan fájlok melyek neve nem lehet számjegy a Dokumentumok/hello mappában (a ^ elhagyásával magától érhetődően olyan fájlokat fogunk listázni melyek csak számjegyeket tartalmaznak):
lekogabi@lekogabi:~/Dokumentumok/hello$ ls *[^0-9]*.*
egrep [kapcsoló][minta]<fájl>
*Kiírja egy fájl azon sorait, amelyekben szerepel a minta szövegrészlet.
Kapocsolók:
-c: az illeszkedő sorok tartalma helyett csak azok darabszáma jelenik meg.
-v: azon sorait írja ki, amik nem tartalmazzák a minta szövegrészletet.
-e minta : minta megadása; segítségével több minta is megadható, illetve akkor is jó, ha a minta a - karakterrel kezdődik.
-r, -R: könyvtárak feldolgozása rekurzívan.
-A # : # db sor kiírása az illeszkedő sorok után.
-B # : # db sor kiírása az illeszkedő sorok előtt.
-C # : # db sor kiírása az illeszkedő sorok előtt és után.
pl.:
lekogabi@lekogabi:~/Dokumentumok$ cat file2.txt elso masodik harmadik negyedik otodik hatodik hetedik nyolcadik kilencedik tizedik lekogabi@lekogabi:~/Dokumentumok$ egrep hat file2.txt hatodik lekogabi@lekogabi:~/Dokumentumok$ egrep ed file2.txt negyedik hetedik kilencedik tizedik lekogabi@lekogabi:~/Dokumentumok$ egrep -v ed file2.txt elso masodik harmadik otodik hatodik nyolcadik
Lehetőségünk van több elemet is felsorolni egymás után, viszont ebben az esetben köztelező a "-e" kapcsoló használata minden minta előtt:
lekogabi@lekogabi:~/Dokumentumok$ egrep -e elso -e masodik file2.txt elso masodik
Felhasználók
finger <argumentum>
who
*whoami
*groups
passwd
w
Kiírja, hogy kik vannak bejelentkezve az aktuális gépre.
felhasználó: a megadott felhasználóról ír ki adatokat.
Kiírja, hogy kik vannak bejelentkezve az aktuális gépre, plusz adatokat ír ki a finger-hez képest.
Aktuális felhasználó azonosítójának kiírása.
Aktuális felhasználó csoportjának kiírása.
Aktuális felhasználó jelszavának beállítása (root bárkiét beállíthatja).
Ugyanaz, mint a who, csak kiírja, hogy min dolgozik.
Linkelés
ln [kapcsoló]<forrás><cél>
*
(link)
Az első paraméter a fájl, amihez szeretnénk linket készíteni, a második paraméter a link neve. Kapcsoló nélkül hard link készítése.
Kapcsolók:
-s: Szimbólikus (soft) link készitése.
Hard link pl.:
lekogabi@lekogabi:~/Dokumentumok$ cat > file1.txt hello lekogabi@lekogabi:~/Dokumentumok$ ln file1.txt file2.txt lekogabi@lekogabi:~/Dokumentumok$ ls -l -rw-r--r-- 2 lekogabi lekogabi 6 aug 7 01:15 file1.txt -rw-r--r-- 2 lekogabi lekogabi 6 aug 7 01:15 file2.txt lekogabi@lekogabi:~/Dokumentumok$ cat >> file1.txt world!
Létrehozunk egy .txt fájlt 'file1' névvel, melybe a "hello" szöveget irtuk. Majd készitettünk egy hard linket a fájlunkról 'file2' névvel. Majd módositottuk a file1-et, amelynek eredményeképp a file2 is módosult. Így mindkét .txt fájlban a "hello world!" szöveg fog szerepelni. Listázásnál a második mezõ jelenti a fájlra mutató hard linkek számát. Ha kitöröljük az egyik fájlt, attól a másik még használható. Gondolhatunk a Hard link-re egyfajta biztonsági mentés + automatikus módosítás kombinációra.
Szimbólikus link:
lekogabi@lekogabi:~/Dokumentumok$ ln -s file1.txt file3.txt lekogabi@lekogabi:~/Dokumentumok$ ls -l -rw-r--r-- 2 lekogabi lekogabi 13 aug 7 01:16 file1.txt -rw-r--r-- 2 lekogabi lekogabi 13 aug 7 01:16 file2.txt lrwxrwxrwx 1 lekogabi lekogabi 9 aug 7 01:29 file3.txt -> file1.txt lekogabi@lekogabi:~/Dokumentumok$ cat >> file1.txt lekogabi@lekogabi:~/Dokumentumok$ rm file1.txt lekogabi@lekogabi:~/Dokumentumok$ ls -l -rw-r--r-- 1 lekogabi lekogabi 29 aug 7 01:34 file2.txt lrwxrwxrwx 1 lekogabi lekogabi 9 aug 7 01:29 file3.txt -> file1.txt
A meglvévő file1.txt fájlunkhoz készítünk egy szimbólikus linket. Listázás után ez jól megfigyelhető az elkészült file3.txt után látható nyil alapján, amely a file1.txt-re mutat. A hard linkkel ellentétben, amennyiben töröljük a file1.txt-t, akkor a file3.txt használhatatlan lesz, mivel töröltük a fájlt, amire mutatott.
Jogosultságok
chmod
*
Az elérési jogok megváltoztatása a chmod paranccsal lehetséges a tulajdonos számára. Szintaxisa pedig:
1. verzió:
chmod [ugoa][+-][rwx] fájlnév
Az [ugoa] kapcsolókkal írjuk elõ, hogy kinek adjuk a jogot. Adhatunk jogokat a tulajdonosnak (u - user), a csoportnak (g - group), másoknak (o - others) vagy pedig mindenkinek egyszerre (a - all). A [+-] azt jelenti, hogy adhatunk (+) vagy elvehetünk (-) jogokat. Végül pedig, hogy olvasási (r - Read), írási (w - Write) vagy futtatási (eXecute) jogot adunk. pl.:
lekogabi@lekogabi:~/Dokumentumok$ ls -l drwxrwxrwx 2 lekogabi lekogabi 4096 aug 9 15:07 hello lekogabi@lekogabi:~/Dokumentumok$ chmod g-w hello lekogabi@lekogabi:~/Dokumentumok$ ls -l drwxr-xrwx 2 lekogabi lekogabi 4096 aug 9 15:07 hello
2. verzió
chmod <xxx> fájlnév
Hasonló az előzőhöz, viszont itt minden x helyén 0-7-ig való osztályozással adható meg a különböző felhasználói csoportok jogosultágai.
Rendre egy darab x helyettesítésének jelentése:
0: 000 --- semmi jog 1: 001 --x csak futtatási 2: 010 -w- csak írási 3: 011 -wx írási és futtatási 4: 100 r-- csak olvasási 5: 101 r-x olvasási és futtatási 6: 110 rw- olvasási és írási 7: 111 rwx olvasási, írási és futtatási jog
pl.:
lekogabi@lekogabi:~/Dokumentumok$ ls -l drwx----wx 2 lekogabi lekogabi 4096 aug 9 15:07 hello lekogabi@lekogabi:~/Dokumentumok$ chmod 777 hello lekogabi@lekogabi:~/Dokumentumok$ ls -l drwxrwxrwx 2 lekogabi lekogabi 4096 aug 9 15:07 hello
Kapcsolók:
-R: rekurzívan az összes fájlra és alkönyvtárra.
Keresés
find
*
find [útvonal...] [kifejezés]
Fájlokat keres egy könyvtárstruktúrában. A find parancs rengeteg kapcsolóval rendelkezik, emellett operátorokat is használhatunk vele, részletesebben lásd man find.
Megj.: Csak néhány egyszerűbb kapcsoló használatára lesz szükség:
- -name (sztringet vár)
- -type (d: dir, f: fájl, l: link)
- -size (lehet +/- majd a méret, attól függően, hogy annál nagyobb vagy kisebb méretűeket keresünk)
Keressük meg a txt kiterjesztésű fájlokat:
lekogabi@lekogabi:~/Dokumentumok$ find . -name "*.txt"
Hány ilyen fájl van?
lekogabi@lekogabi:~/Dokumentumok$ find . -name "*.txt" | wc -l
Összes mappa listázása:
lekogabi@lekogabi:~/Dokumentumok$ find . -type d
Folyamatok leállítása
^C
*
Ctrl+c paranccsal leállíthatunk előtérben futó folyamatokat.
B1
Emlékeztetőül:
A shell az operációs rendszer legkülső része, mely a felhasználókkal való kommunkiációra szolgál, felhasználói parancsokkal. A shell-nek több típusa is van. Az egyik legelterjedtebb a BASH shell (Bourne Again SHell), ezt fogjuk használni mi is.
Miért jó ez nekünk?
Ha több linux parancsot szeretnénk egymás után végrehajtatni, bonyolultabb lekérdezések, fájlműveletek, végrehajtások esetén hasznos lehet egy olyan script, amelyen belül ezeket az utasításokat egy rendszerbe foglalhatjuk és egy BASH script megindításával lefuttathatjuk.
Lépésről lépésre:
script fájl
A BASH script-jeink kiterjesztése .sh lesz. Úgyhogy kezdhetjük azzal a további pontok átnézését, hogy létrehozunk egy fájlt ezzel a kiterjesztéssel.
A futtatást és paraméterezést a progalapon is már megszokott módon fogjuk megejteni.
Példa:
./fájlnév.sh param1 param2
Komment
Egy soros:
#
Több soros:
: '
tetszőleges programkód
'
Minden BASH script első sora
Ez az ún. "Hash-Bang" vagy "She-Bang". Ez mondja meg a shell-nek, hogy milyen programmal interpretálja a szkriptet
#!/bin/bash
Nem szerepelhet a sorban egyetlen szóköz sem!
Változók
$valtozonev
vagy
${valtozonev}
A változó neve nem kezdődhet számmal. A változóbehelyettesítés használatakor a változónév elé egy $ karaktert írunk. Az adott helyre a BASH a változó értékét helyettesíti be. Nagyon fontos, hogy értékadáskor NEM lehet helyköz sem az = bal, sem jobb oldalán.
#!/bin/bash
VAL="Bela"
echo $VAL
echo ${VAL}25
A kiírott szöveg a "Bela" majd "Bela25" lesz.
Tehát egymagában ez így NEM állná meg a helyét (változó kiíratás esetén): echo VAL
Érték beolvasása
read valtozonev
#!/bin/bash
read VAL
echo $VAL
Idézőjelek
" " - felismeri a speciális karaktereket.
' ' - nem ismeri fel a speciális karaktereket.
` ` - (AltGr + 7) parancsvégrehajtást jelöl.
#!/bin/bash
VAL="Bela"
echo "VAL = $VAL"
echo 'VAL = $VAL'
VAL=`echo $VAL | tr a-z A-Z`
echo $VAL
Kiíratott szöveg:
VAL = Bela VAL = $VAL BELA
Beágyazott utasítás
$(utasitas)
Ha a programkódon belül szeretnénk végrehajtatni egy utasítást.
#!/bin/bash
VAL=$(pwd)
echo $VAL
A VAL tartalma az aktuális elérési útvonal lesz. Ezt íratjuk ki az utolsó sorban.
Tehát egymagában ez így NEM állná meg a helyét (utasításra hivatkozás esetén): VAL=pwd
Parancssori paraméterek
Néhány frekventáltabban használt paraméter:
$# - A parancssori paraméterek száma.
$? - A legutoljára végrehajtott parancs visszatérési értéke.
$n - Az n-edik parancssori paraméter értéke. (Tehát pl. $1 az 1., $2 a 2., ... paraméter értéke.)
$0 - A pillanatnyi héjprogram neve.
$* - Valamennyi parancssori paraméter egyben, egyetlen karakterláncként ("$1 $2 ... $9 ...").
Logikai operátorok, relációs jelek, műveletek
|, &
<, <=, >, >=, =, ==, !=
+, -, *, /, %
Matematiai kifejezések
3 lehetőségünk is van (A VAL értéke minden esetben 5 lesz):
expr
VAL=`expr 3 + 2`
Kötelezően helyközzel az értékek között!
$(())
VAL=$((3+2))
let
let VAL=3+2 # egy kis reszrehajlas: szerintem ez a legpraktikusabb
Tehát egymagában ez így NEM állná meg a helyét (művelet végrehajtás esetén): VAL=3+2
Feladatok:
(A feladatok megoldásai elérhetőek lesznek ugyanitt, a gyakorlatot követő pár napon belül.)
1. Írj szkriptet, amely két parancssori paramétert vár. Egy fájl nevét és egy számot. A script írja ki az 1. paraméterben megadott fájl, 2. paraméterben megadott sorát.
2. Írj szkriptet, amely három parancssori paramétert vár. Mind a három egy-egy fájlnak a neve legyen. A script fűzze össze az 1. és 2. paraméter tartalmát a 3. paraméterben megadott nevű fájlba.
3. Írj szkriptet, amely egy paramétert vár, mely egy fájlnak a neve. A script írja ki a megadott fájl sorait ABC sorrendben.
4. Írj szkriptet, amely két parancssori paramétert vár. Mindkét paraméter egy-egy szövegfájl legyen, melyek első sora egy-egy számot tartalmaz. A szkript írja ki ennek a két számnak az összegét a képernyőre.
5. Írj szkriptet, amely két parancssori paramétert vár. Mindkét paraméter egy-egy szövegfájl legyen (tobb soros tartalommal). A szkript cserélje meg a két fájl első sorait.
A feladatok megoldásai egy .sh fájlon belül. Használati útmutató a fájl elején: osB1.sh .
B2
if
if [[ feltétel ]] ; then
. . .
elif [[ feltétel ]] ; then
. . .
else
. . .
fi
Feltételes kifejezések
A feltételeket csak speciális kapcsolókkal tudjuk megadni. Ellenkező esetekben más művelet történne (pl. > esetén beleirányítás.)
Numerikus és logikai operátorok
Kif1 -eq Kif2 Egyenlő # EQual
Kif1 -ne Kif2 Nem egyenlő # Not Equal
Kif1 -lt Kif2 Kisebb # Less Then
Kif1 -le Kif2 Kisebb vagy egyenlő # Less or Equal
Kif1 -gt Kif2 Nagyobb # Greater Then
Kif1 -ge Kif2 Nagyobb vagy egyenlő # Greather or Equal
Kif1 -a Kif2 Logikai ÉS # And
Kif1 -o Kif2 Logikai VAGY # Or
!Kif Logikai tagadás
Kif1 && Kif2 Logikai ÉS ez is
Kif1 || Kif2 Logikai VAGY ez is
-z String 0 hosszúságú # Zero
String nem 0 hosszúságú
String!=String nem egyenlők
String=String egyenlők
Példák:
#!/bin/bash
if [[ 8 -lt 9 ]] ; then
echo "Nyolc kisebb, mint kilenc."
fi
#!/bin/bash
VAR1="Bela"
VAR2="Jeno"
if [[ $VAR1 != $VAR2 ]] ; then
echo "A ket String nem egyezik meg."
fi
#!/bin/bash
if [[ $# == 1 ]] && [[ $1 -gt 1 ]] && [[ $1 -lt 10 ]] ; then
echo "A parancssori parameter erteke 1 es 10 kozott van."
fi
Fájlvizsgálat
Az alábbi kapcsolókkal a rendszerben megtalálható fájlokra kérdezhetünk rá.
-b fájlnév blokkeszköz-meghajtó # Block
-c fájlnév karaktereszköz-meghajtó # Character
-d fájlnév könyvtár # Directory
-f fájlnév szabályos állomány # File
-l fájlnév közvetett hivatkozás # Link
-p fájlnév csővezeték # Pipe line
-e fájlnév létezik # Exists
-G fájlnév saját csoportba tartozik # Group
-O fájlnév saját tulajdon # Own
-r fájlnév olvasható # Read
-w fájlnév írható # Write
-x fájlnév futtatható # eXecute
-s fájlnév fájlnév üres # String
-h fájlnév igaz, ha a fájlnév létező szimbolikus lánc neve (Ez nem szerepel a jegyzetben, de tudni kell)
fájl1 -nt fájl2 a fájl1 újabb, mint a fájl2 # Newer
fájl1 -ot fájl2 a fájl1 régebbi, mint a fájl2 # Older
fájl1 -ef fájl2 a fájl1 és fájl2 azonos állományt jelöl # Equal
Példák:
# Az alabbi script megnezi, hogy letezik-e a file2.txt fajl
#!/bin/bash
if [[ -e file2.txt ]] ; then
echo "A fajl letezik."
fi
# Az alabbi script megnezi, hogy a VAR ures-e
#!/bin/bash
VAR="Bela"
if [[ ! -s $VAR ]] ; then
echo "A valtozo tartalma nem ures."
fi
for - lista alapú
for valtozo in lista ; do
. . .
done
A változó rendre felveszi a lista elemeinek értékét és minden értékkel végrehajtódik az utasítás blokk minden utasítása.
A változó lehet:
- BASH változó neve, vagy
- Környezeti változó neve.
A lista lehet:
- Szavak szóközökkel elválasztott listája, vagy
- Állománynév helyettesítő karakterekkel megadott állománylista, vagy
- változók listája, vagy
- végrehajtandó parancs a $(...) vagy `...` szerkezettel.
# Az alabbi script vegig megy a for-ban megadott listan (hetfo kedd szerda) es kiirja oket a kepernyore
#!/bin/bash
for DAY in hetfo kedd szerda ; do
echo $DAY
done
# Az alabbi script vegig megy a parancssori parametereken es kiiratja oket
#!/bin/bash
for param in $* ; do
echo $param
done
for - index alapú
for (( i=0; i<=$N; i++ )); do
. . .
done
VAGY
for i in {1..10} ; do
. . .
done
A már jól megszokott indexszelős for ciklus. Nem igazán fogjuk használni, de azért bemutatjuk, hogy ilyen is van.
# Az alabbi script kiirja 0-tol az elso parameter mereteig a szamokat
#!/bin/bash
for (( i=0; i<$1; i++ )); do
echo $i
done
Feladatok:
(A feladatok megoldásai elérhetőek lesznek ugyanitt, a gyakorlatot követő pár napon belül.)
1. Írj szkriptet, amely beolvas egy szöveget, eltárolja azt, majd kiírja a konzolra.
2. Írj szkriptet, amely eldönti, hogy a ket fajl azonos állományt jelöl-e (Pl. ha az egyik link-kel a masikra).
3. Írj szkriptet, amely eldönti a két bemeneti paraméterről, hogy melyik a nagyobb.
4. Írj szkriptet, amely eldönti a paraméterről, hogy mappa vagy közönséges fájl.
5. Írj szkriptet, amely végig megy az aktuális könyvtár tartalmán és kiírja az összes fájl nevét.
6. Írj szkriptet, amely összeadja a bemeneti paramétereket.
7. Írj szkriptet, amely kiírja a paraméterként kapott fájlok típusát (Nem kell lekezelni azt az esetet, ha a paraméternek nincs kiterjesztése.).
8. Írj szkriptet, amely eldönti a tetszőleges számú bemeneti paraméterről, hogy melyik a legnagyobb.
9. Írj szkriptet, amely az összes .txt kiterjesztésű fájl nevét nagybetűsíti, de a kiterjesztést nem változtatja. Pl. file.txt -> FILE.txt (mivel .txt), viszont file -> file (mivel nem .txt).
A feladatok megoldásai egy .sh fájlon belül. Használati útmutató a fájl elején: osB2.sh .
B3
while
*
while utasitas ; do
. . .
done
A for esetében a végtelen ciklus alkotásával gondjaink akadhattak. Ezzel szemben a while tökéletes lehetőséget nyújt számunkra végtelen ciklusok létrehozására.
#!/bin/bash
while true ; do
echo " Futok ... "
sleep 3 # egy kis erdekesseg: a sleep parancs felfuggeszti a program futasat a parametere altal megadott masodpercre
done
do-until
until utasitas ; do
. . .
done
Az until szerkezet addig ismétli az utasításblokkot, amíg az utasítás visszatérési értéke hamis. Az until tehát while szerkezethez képest a feltételként adott utasítás értelmét az ellentettjére változtatja.
case
case szo in
minta1a | minta1b )
utasitasblokk1 ;;
minta2 )
utasitasblokk2 ;;
* ) utasitasblokk0 # default ag
esac # fun fact: ez a "case" visszafele (magic)
# Az alabbi script az egy darab parancssori parameter alapjan valaszt az alabbi opciokbol, majd kiirja a kepernyore az illeszkedo esetet
#!/bin/bash
case $1 in
1 )
echo "Hinnye, de nagyon hetfo" ;;
2 )
echo "Szinte hetfo" ;;
3 | 4 )
echo "Na kozeledunk" ;;
5 | 6 )
echo "Azert ez mar valami" ;;
7 )
echo "Jajj, anyam.." ;;
* ) echo "rossz input"
esac
függvények
function fuggvenynev (){
. . .
}
Hívás:
fuggvenynev [ parameterek ]
# Az alabbi script feltetelezi, hogy az fgv fuggvenynek egy parametere van es ezt a parametert irja ki
#!/bin/bash
function fgv (){
echo $1
}
fgv "Bela"
# Az alabbi script feltetelezi, hogy az fgv2 fuggvenynek ketto parametere van es ezeknek az osszeget irja ki
#!/bin/bash
function fgv2 (){
let SUM=$1+$2
echo $SUM
}
fgv2 2 3
exit
*Úgy lehet elképzelni, mint C-ben a return. Ahol kiadjuk ezt a parancsot ott terminál a program. Közvetlen az exit utasítás után meg lehet adni a kilépési állapotot (egy szám).
Ahogy C-ben, itt is a 0 jelzi, ha minden rendben volt, 1 pedig ha vmi hiba történt. 2-255-ig mi magunk is adhatunk meg valamilyen kilépési státuszt.
Rövid emlékeztető: a $? az előző parancs exit állapotára hivatkozó változó. Segítségével könnyedén leellenőrizhető, hogy az előző parancs sikeresen lefutott-e. Ha igen, akkor 0 értéket vesz fel, ellenkező esetben 1 lesz az értéke.
Példa:
# Az alabbi script elso soraban megprobalunk letrehozni egy "mappa" nevu mappat.
# Ha sikerul, akkor a $? erteke 0 lesz es az if ag teljesul, ellenkezo esetben az else ag fut le.
# Peldaul akkor lehet sikertelen, ha az adott mappa mar letezik. (Probaljuk ki mindket esetben.)
#!/bin/bash
mkdir mappa
if [ $? -eq 0 ] ; then
echo "Sikeres volt az elozo muvelet."
else
echo "Sikertelen volt az elozo muvelet."
exit
fi
echo "Ha sikertelen volt, akkor ide mar nem jut el a program."
break, continue
*A break-et és a continue-t már jól ismerhetjük C-ből. A szerepük itt is ugyanaz. A break-et kiadva azonnal kilépünk az adott ciklusból, a continue-val pedig a ciklus következő iterációjára lépünk.
Példa:
#!/bin/bash
# Az alabbi script egy vegtelen ciklust tartalmaz, mely 1-tol felfele osszeadja a szamokat.
# Mielott hozza adnank az osszeghez az aktualis szamot, megnezzuk,
# hogy az osszeg meghaladta-e a 100-as erteket. Amennyiben igen, a ciklusbol kilepunk.
# Amennyiben az adott szam oszthato 5-tel, akkor nem adjuk hozza az osszeghez, hanem a kovetkezo iteraciora lepunk.
osszeg=0
val=0
while true ; do
let val=$val+1
echo val: $val
if [ $osszeg -ge 100 ] ; then
break
fi
let maradek=$val%5
if [ $maradek -eq 0 ] ; then
continue
fi
let osszeg=$osszeg+$val
echo osszeg: $osszeg
done
echo $val
echo $osszeg
Feladatok:
(A feladatok megoldásai elérhetőek lesznek ugyanitt, a gyakorlatot követő pár napon belül.)
1. Írj szkriptet, amely 3 parancssori argumentumot vár. 2 egész értéket és egy operátort (+,-,x vagy /). A output az alap matematikai műveletek eredménye az adott két egész értékkel. Ellenőrizzük is le az argumentumok számát. Amennyiben nem megfelelő, akkor írjunk ki hibaüzenetet.
2. Írj szkriptet, amely 1 parancssori argumentumot vár, mely egy egész szám. Az output pedig ez a szám számjegyeinek összege. (Pl.: 123 -> 1+2+3=6.) Ellenőrizzük is le az argumentumok számát. Amennyiben nem megfelelő, akkor írjunk ki hibaüzenetet. (Hint: Pl.: 123/10 = 12 és 123%10=3, 12/10=1 és 12%10=2, 1/10=0 és 1%10=1, de működnie kell tetszőleges számra.)
KÖVETKEZŐ GYAKORLATON 1. Nagy ZH!
Cirok Dávid segédlete 1. ZH-hoz (minta ZH részletesen levezetett megoldással):
Hirling Dominik által összeállított minta ZH-k:
Nem elfelejteni: Griechisch Erika jegyzete a ZH-k alatt is elérhető és használható lesz (mindenképpen nézzétek át gyakorláskor, hogy ne legyen idegen).
1. ZH
A1
Reguláris kifejezések
Regular expression / regex. Hasonló az egrep-nél tanultakhoz. Abban az esetben, ha összetettebb lekérdezéseket szeretnék, amelyek valamilyen minta alapján illeszkednek egy bizonyos szövegre, akkor a reguláris kifejezések használata hasznos lehet.
Ha szeretnénk hasonló elemeket keresni egy adott szövegben, vagy hasonló kategóriába tartozó szövegeket (pl. weboldalak címei, email címek, dátumok, ...) szeretnék összegyűjteni, megszámolni mennyi van az adott elemekből.
Tehát ezen az alfejezeten belül szöveges fájlokon fogunk dolgozni.
Elemi kifejezések:
- (KIF) - A zárójelen belül megadott szövegre fog illeszkedni. A zárójelezés műveleti sorrend miatt is fontos lehet!
- () - Az üres szóra illeszkedik.
- [HALMAZ] - A halmaz bármely karakterének egy példányára illeszkedik. A halmazt a karakterek egymás mellé írásával adhatjuk meg.
- [TOL-IG] - Mint előbb, de itt egy tartományt adunk meg.
- [^HALMAZ] - A halmazban nem szereplő bármely karakter egy példányára illeszkedik (a sortörést kivéve).
- . - Bármilyen karakter egy példányára illeszkedik (a sortörést kivéve).
- ^ - A sor elejére illeszkedik.
- $ - A sor végére illeszkedik.
- \KARAKTER - A \ után írt speciális jelentésű karaktert közönségesként kezeli.
- KARAKTER - Bármely közönséges karakter saját maga egy példányára illeszkedik.
Összetett kifejezések:
- KIF1KIF2 - (két kifejezés egymás mellé írása): Összefűzés, konkatenáció (concatenation). Olyan szövegre illeszkedik, amelynek első fele KIF1-re, második fele KIF2-re illeszkedik. Több kifejezést is összefűzhetünk.
- KIF1|KIF2| . . . - Logikai MEGENGEDŐ VAGY (diszjunkció), alternáció (alternation). Olyan szövegre illeszkedik, amely legalább az egyik kifejezésre (alternatívára) illeszkedik.
- KIF* - KIF akárhány egymást követő példányára illeszkedik (0 is)
- KIF+ - KIF legalább 1 egymást követő példányára illeszkedik
- KIF? - KIF 0 vagy 1 példányára illeszkedik (azaz KIF opcionális)
- KIF{I} - KIF pontosan I egymást követő példányára illeszkedik
- KIF{I,} - KIF legalább I egymást követő példányára illeszkedik
- KIF{I,J} - mint előbb, de legfeljebb J példányra illeszkedik (I <= J)
Ismételt illesztés, ismétlésszám megadása, iteráció (repetition, iteration):
Műveleti erősség csökkenő sorrendben: iteráció, konkatenáció, alternáció.
Egy kis emlékeztető néhány kiegészítővel: egrep (eredetileg 3. gyakorlat vége)
- egrep [kapcsoló][minta]<fájl>
Kiírja egy fájl azon sorait, amelyekben szerepel a minta szövegrészlet.
Kapocsolók:
-c: az illeszkedő sorok tartalma helyett csak azok darabszáma jelenik meg.
-n: az illeszkedő sor sorszámát is kiírja.
-v: azon sorait írja ki, amik nem tartalmazzák a minta szövegrészletet.
-A # : # db sor kiírása az illeszkedő sorok után.
-B # : # db sor kiírása az illeszkedő sorok előtt.
-C # : # db sor kiírása az illeszkedő sorok előtt és után.
-e minta : minta megadása; segítségével több minta is megadható, illetve akkor is jó, ha a minta a - karakterrel kezdődik.
-r, -R: könyvtárak feldolgozása rekurzívan.
Reguláris kifejezések megértéséhez javasolt a --color kapcsoló használata (kiszínezi az illeszkedést).
FONTOS (!):
1: A továbbiakban ha egrep-et használunk, mindig tegyük az illesztendő kifejezést ' '-ok (aposztrófok) közé.
2: Reguláris kifejezéseknél a * egymagában NEM tetszőleges számú karaktert jelent, hanem az előtte megjelölt kifejezésből lehet tetszőleges számú. Pl.: az '(alma)*' nem azt jelenti, hogy az "alma" szó utána bármennyi tetszőleges karakter lehet, hanem az "alma" szóból lehet tetszőleges számú egymás után.
Példák:
'alma' azt jelenti, hogy a minta a soron belül bárhol előfordulhat
'^alma' előírja, hogy a mintának a sor elején kell előfordulnia
'^alma$' előírja, hogy a mintának ki kell töltenie az egész sort
'^(alma){2}$' előírja, hogy a mintának kétszer kell szerepelnie közvetlenül egymás után. A 2-es helyére írhatnánk bármilyen más számot, vagy az egész {2} helyére tehetnék * (bármennyi "alma"), + (legalább egy "alma") és ? (0 vagy 1 "alma") karaktereket is.
. . .
lekogabi@lekogabi:~/Dokumentumok$ cat file.txt ebben a sorban van alma alma almafa almaalma vmi az alma is alma lekogabi@lekogabi:~/Dokumentumok$ egrep --color 'alma' file.txt ebben a sorban van alma alma almafa almaalma vmi az alma is alma lekogabi@lekogabi:~/Dokumentumok$ egrep --color '^alma' file.txt alma almafa almaalma lekogabi@lekogabi:~/Dokumentumok$ egrep --color '^alma$' file.txt alma lekogabi@lekogabi:~/Dokumentumok$ egrep --color '(alma){2}' file.txt almaalma
Feladatok:
(A feladatok megoldásai elérhetőek lesznek ugyanitt, a gyakorlatot követő pár napon belül.)
1. Dátum feldolgozása reguláris kifejezéssel. (Közelítő megoldás)
Példafájl: date.txt
Az elvárt kimenet a date.txt alapján:
2018.04.12. 2018/04/12 1999-01-01 1456.06.07.
Egy lehetséges megoldás:
egrep --color '^[0-9]{4}[\./-](([0][1-9])|([1][012]))[\./-](([0][1-9])|([12][0-9])|([3][01]))([\./-]?)$' date.txt
Magyarázat:
Sor elején kezdődjön | 4 darab szám | | Az alábbi karakterek egyike: '.' '/' '-' | | | Egy jegyű és két jegyű számok 1től 12ig | | | | | 1-9 10-29 30-31 vagy van vagy nincs elválasztójel a végén | | | | | | | | | Sor végéig tartson az illesztés | | | | | | | | | | _ ______ ____ __________ _________ ________ _________ _______ _ _ | | | || | | | | | | | | | | | | | | egrep --color ' ^ [0-9]{4}[\./-] (([0][1-9])|([1][012]))[\./-] (([0][1-9])|([12][0-9])|([3][01]))([\./-]?) $' date.txt
2. Email cím feldolgozása reguláris kifejezéssel. (Közelítő megoldás)
Példafájl: email.txt
Az elvárt kimenet az email.txt alapján:
jmcnamara@verizon.net.net emmanuel@yahoo.com arandal@mac.com netsfr@outlook.com moinefou@sbcglobal.net jmorris@mac.com kewley@yahoo.info multiplx@yahoo.com paina@outlook.com user@inf.u-szeged.hu
Egy lehetséges megoldás:
egrep --color '^[0-9a-z\.-]+@([0-9a-z-]+\.)+[a-z]{2,4}$' email.txt
Magyarázat:
Lehet bármilyen szám, kis betű, majd a végén egy pont | Ez az előző minta ismétlődhet, minimum egynek lennie kell | | Hasonló, mint az előző viszont a pont csak a végén lehet, és ez ismétlődhet, | | úgy hogy min 1 darab legyen, és egy darabon belül min 1 karakter | | | A végén csak betűk lehetnek | | | | és azokból is 2 és 4 közötti mennyiségű | | | | | _________ _ ____________ ___ ___ | || | | | | || | egrep --color '^[0-9a-z\.-] + @ ([0-9a-z-]+\.)+[a-z]{2,4}$' email.txt
AWK I.
Szövegfeldolgozó nyelv. Az awk bemenete fájlból és a szabványos bemenetről egyaránt érkezhet.
Az AWK script-jeink kiterjesztése .awk lesz.
A szkript első sora:
#!/usr/bin/gawk -f
Futattás hasonló módon, ahogy már eddig is láttuk:
./fájlnév.awk param1 ...
A futtatáskori munkaállomány megadására több lehetőség is van. Lásd lentebb a feladatoknál!
Felépítés
Minden AWK forrásprogram szabályok sorozata. Minden szabály tartalmazhat egy mintát és egy hozzá tartozó tevékenységet avagy akciót. Az akciót különféle utasításokból állíthatjuk össze.
A szabályok alakja: MINTA{AKCIÓ}, ahol a MINTA valamilyen logikai feltétel, az AKCIÓ pedig legtöbbször utasítások sorozata
A szabályokat egymástól sortöréssel vagy pontosvesszővel lehet elválasztani.
A feldolgozás során a bemenet tartalmát rekordokra (record) bontja, ezek alapesetben a bemenet sorai lesznek. A rekordokat szintén továbbontja mezőkre (field), amiket alapesetben az illető sor szavai képviselnek.
Például, ha egy adott szöveges fájl az alábbi módon néz ki:
Ezt a fajlt szeretnem feldolgozni A gyakorlaton valo bemutatas erdekeben
Akkor mind a két sor 1-1 rekordnak minősűl. Egy rekordra $0-val lehet hivatkozni. Az összes szó pedig 1-1 mező. Ezekre a mezőkre a $1,$2,...,$n formájában hivatkozhatunk. Figyelem, ezeknek a szimbólumoknak semmi közük a program parancssori paramétereihez!
$1 $2 $3 $4 $5 $0 -> Ezt a fajlt szeretnem feldolgozni $0 -> A gyakorlaton valo bemutatas erdekeben
A bemenet feldolgozása tehát rekordonként történik. Minden rekordot megpróbál illeszteni sorban az összes szabály mintájára, az első szabálytól kezdve. Ha a rekord illeszkedett egy szabály mintájára, akkor végrehajtódik a hozzá tartozó akció. Végül az összes szabály ellenőrzése után rátér a következő rekord feldolgozására.
Egy awk program sematikus felépítése:
#!/usr/bin/gawk -f
BEGIN {
utasítások
}
{
főprogram
}
END {
utasítások
}
BEGIN csak a bemenet feldolgozása előtt teljesül. A BEGIN mintához tartozó akció pontosan egyszer hajtódik végre, mégpedig a legelső bemeneti rekord feldolgozása előtt. Ez akkor is így történik, ha több bemeneti állományt adtunk meg.
A „főprogramban” található utasításokat az awk a bemenet valamennyi során önműködően végrehajtja, vagyis a program eleve tartalmaz egy rejtett (implicit) ciklust. (Emlékezzünk rá, hogy BASH esetén a táblázat sorainak végigpásztázásához nekünk magunknak kellett ciklust írnunk.)
END csak a bemenet feldolgozása után teljesül. A BEGIN mintához hasonlóan, az END mintához tartozó akció is pontosan egyszer, az utolsó bemeneti rekord feldolgozása után hajtódik végre. Ezt az awk program befejeződése követi.
Minták
(MINTA) csoportosítás (műveleti sorrend felülbírálása), MINTA-ra illeszkedik.
!MINTA logikai tagadás (negáció).
/REGKIF/ igaz, ha az egész rekord illeszkedik a reguláris kifejezésre.
KIF~/REGKIF/ igaz, ha a KIF kifejezés mint szöveg illeszkedik a reguláris kifejezésre.
KIF!~/REGKIF/ igaz, ha a kifejezés nem illeszkedik a REGKIF-re.
Relációs kifejezések tetszőleges kifejezés, amely relációs jelet tartalmaz (<, <=, >, >=, ==, !=).
Egy egyszerű Hello World AWK-ban:
#!/usr/bin/awk -f
BEGIN
{
print "Hello, world" # a print paranccsal tudunk kiíratni szöveget a képernyőre
}
Feladatok:
(A feladatok megoldásai elérhetőek lesznek ugyanitt, a gyakorlatot követő pár napon belül.)
1. Írj szkriptet, amely az ls -l kimenetében megkeresi a szabályos állományokat (fájlokat) és azok nevét írja ki a képernyőre. osA1_01.awk
1. Beleirányítjuk az "ls -l"-t egy fájlba, majd azt használjuk bemeneti paraméterként:
A futtatáskor meg kell adni valahogy, hogy az "ls -l" kimenetén működjön. Erre két lehetőségünk is van.
lekogabi@lekogabi:~/Dokumentumok$ ls -l > test.txt lekogabi@lekogabi:~/Dokumentumok$ ./osA1_01.awk test.txt
2. Csővezetéket használunk:
lekogabi@lekogabi:~/Dokumentumok$ ls -l | ./osA1_01.awk
2. Írj szkriptet, amely kiírja a bemeneti fájl 1. és 2. oszlopát fordított sorrendben. osA1_02.awk
3. Írj szkriptet, amely a bemeneti fájlt utolsó sorát írja ki. osA1_03.awk
4. Írj szkriptet, amely egy általad meghatározott szöverészletet keres az adott mappa szöveges fájljaiban. osA1_04.awk
A további feladatok a következő órára csúsznak!
Változók használatát igénylő feladatok:
5. Írj szkriptet, amely egy általad meghatározott szövegrészletet keres az adott mappa szöveges fájljaiban és megszámolja, hogy hány illeszkedés volt.
6. Írj szkriptet, amely a bemeneti fájl első oszlopában lévő értékeket összeadja, majd kiírja az összeget és az átlagot.
7. Írj szkriptet, amely azon sorokat írja ki, melyek első mezője nem egyezik meg az előző sor első mezőjének értékével.
A2
Konstansok
Számok:
egész számok. pl.: 1,2,184,1354, ...
valós számok pl.: 0.5, 1.23, 125.523, ...(BASH-ban erre nem volt lehetőségünk)
Sztringek:
"szoveg"
"" üres sztring
ú.n. ESCAPE karakter: '\', a speciális karakterek kiiktatására
Változók
Típusok
numerikus változók (valós számokat tárolnak)
szöveges változók avagy sztringek (string)
egydimenziós tömbök
Saját változó:
NÉV=ÉRTÉK
A tömböket kivéve minden változó típusa dinamikus, azaz a használattól függően változik! Ez a tömbelemekre is vonatkozik.
Egy változó típusa az alapján változik amit beleteszünk.
Ahogy már eddig is láthattuk egy változó létrehozását, csupán nem kell típust megadni.
EMLÉKEZTETŐ: NEM teszünk $-jelet a változók neve elé!
Beépített változók
$0 – aktuális feldolgozandó sor
$1,$2,$3,...,$NF - az aktuális soron belüli mezők/szavak
NF – Fumber of Fields, azaz hány mező van egy rekordban (pl. hány szó egy sorban)
NR – Number of Records, az eddig látott rekordok száma, azaz a jelenlegi record sorszáma (NEM az össz rekord száma, mivel azt nem ismerjük még végig nem értünk a fájlon)
FNR – több fájl esetén fájlonkénti aktuális sorának azonosítója
FILENAME – bemeneti fájl neve (amit feldolgozunk)
FS – Field Separator, delimiter (alapértelmezés szerint szóköz)
OFS – Output FS, kimeneti delimiter (alapértelmezés szerint szóköz)
RS – Record Separator, sorhatároló karakter (alapértelmezetten \n)
ORS – Output RS, kimeneti sor delimiter (alapértelmezetten \n)
IGNORECASE – ha nem nulla, akkor azonosak a kis és nagybetűk (alapértelmezés szerint mindig nulla)
Vezérlési szerkezetek
Szelekciós vezérlés: if - else
if (FELTÉTEL){ UTASÍTÁS } else { UTASÍTÁS }
Előfeltételes ismétléses vezérlés: while
while (FELTÉTEL){ UTASÍTÁS }
Végfeltételes ismétléses vezérlés: do-while
do{ UTASÍTÁS } while (FELTÉTEL)
Számlálásos ismétléses vezérlés no.1: for
for (KIF1;KIF2;KIF3){ UTASÍTÁS }
Számlálásos ismétléses vezérlés no.2: for listában
for (INDEX in NÉV){ UTASÍTÁS }Diszkrét ismétléses vezérlést valósít meg. Az INDEX változó sorban felveszi a NÉV nevű tömb elemeinek indexét, miközben a megadott utasítás végrehajtódik.
Beépített függvények
break, continue Kilépés a ciklusból, ill. rátérés a ciklus következő iterációjára (for, while és do...while esetén használhatók). Mindig az őket körbevevő legbelső ciklusra vonatkoznak!
exit A bemenet feldolgozásának azonnali befejezése. Ha nem az END blokkon belül használjuk, akkor az esetleges END minta akciója végrehajtódik, különben az awk rögtön befejezi működését.
print LISTA Kiírja a vesszővel tagolt kifejezéslista tagjainak értékét, majd az ORS tartalmát (alapesetben egy sortörést). A kiírt értékek közé az OFS tartalma kerül (alapesetben egy szóköz).
print ekvivalens a print $0 utasítással (az aktuális rekord teljes tartalmát kiírja)
printf FORMÁTUM, LISTA formázott kiíratás (pont mint a C prog. nyelvben)
next Azonnal nekikezd a következő bemeneti rekord feldolgozásához, a legelső szabály mintáját tesztelve.
Példa:
#!/usr/bin/gawk -f
# Az alábbi program addig adja össze a sorok értékét amíg el nem éri a 10-es összeget.
# Ha az adott sorban páros számot lát, akkor egyből ugorjon a következő rekordra.
# A végén kiírja, hogy mennyi lett az összeg és, hogy hány sort olvasott be az összeg eléréséhez.
BEGIN{
# kezdőértékek beállítása
ossz=0
sorok=0
}
{
sorok++ # ennyi sort láttunk eddig
if ($1%2==0) # ha páros
next # akkor ugrás a következő rekordra
ossz+=$0 # osszeg növelése
if (ossz >= 10) # amennyiben elérte a 10-es értéket, akkor ugrás az END blokkba
exit
}
END{
print "A kapott osszeg: " ossz # kiíratás egyféleképpen
printf("A feldolgozott sorok száma: %s\n", sorok) # kiíratás C-s verzióval - mind2 használható!
}
Feladatok:
(A feladatok megoldásai elérhetőek lesznek ugyanitt, a gyakorlatot követő pár napon belül.)
1. Írj szkriptet, amely egy általad meghatározott szövegrészletet keres az adott mappa szöveges fájljaiban és megszámolja, hogy hány illeszkedés volt. osA2_01.awk
2. Írj szkriptet, amely a bemeneti fájl első oszlopában lévő értékeket összeadja, majd kiírja az összeget és az átlagot. osA2_02.awk
3. Írj szkriptet, amely azon sorokat írja ki, melyek első mezője nem egyezik meg az előző sor első mezőjének értékével. osA2_03.awk
4. Írj szkriptet, amely az oszlopokat fordított sorrendben írja ki. osA2_04.awk
5. Adott n darab állomány (ahol n egy természetes szám). Írj szkriptet, amely megnézi, hogy a bemeneti állományok közül melyik rendelkezett a legtöbb REKORDdal és kiírja a végén ennek az állománynak a nevét és rekordszámát. osA2_05.awk
6. Adott n darab állomány (ahol n egy természetes szám). Írj szkriptet, amely megnézi, hogy a bemeneti állományok közül melyik rendelkezett a legtöbb MEZŐvel és kiírja a végén ennek az állománynak a nevét és mezőszámát. osA2_06.awk
A3
Tömbök
Tömbök tulajdonságai:
1 dimenziós tömbök létrehozárása van lehetőség.
Nem kell előre megadni a tömb méretét.
Nem csak számok lehetnek az indexek, hanem akár szöveg is. Ebben az esetben ASSZOCIATÍV TÖMBről beszélünk.
A tömb vegyesen tartalmazhat numerikus és szöveges elemeket.
NÉV[INDEX]=ÉRTÉK
Értékadás egy létező tömbelemnek, vagy új elem beszúrása
A C programozási nyelv egyéb értékadó, növelő és csökkentő műveletei is használhatók
NÉV[INDEX]
a megadott indexű tömbelem aktuális értékét jelöli
INDEX in NÉV Ez a logikai reláció csak akkor igaz, ha a tömbnek van INDEX indexű eleme. Lásd még: for, while, do . . . while, if utasítások.
delete NÉV[INDEX] a megadott indexű tömbelem kitörlése.
delete NÉV A tömb összes elemének kitörlése. Vigyázat, a tömb továbbra is létezni fog, csak üres lesz!
Szöveges függvények
index(SZÖVEG,RÉSZ) a RÉSZ szöveg legelső előfordulásának pozíciója SZÖVEGben. Ha nincs ilyen rész, akkor nullát ad vissza.
length(SZÖVEG) a megadott sztring hossza karakterekben.
split(SZÖVEG,TÖMB,HAT) a SZÖVEGet a HAT határolójel mentén darabokra bontja, a darabokat a megadott tömbben eltárolja, majd visszaadja a darabok számát. A SZÖVEG változatlan marad. A tömb elemei a darab sorszámával (pont nélkül) lesznek indexelve. HAT reguláris kifejezés is lehet.
substr(SZÖVEG,IND) a szöveg IND sorszámú karakterén kezdődő részét adja vissza
substr(SZÖVEG,IND,HOSSZ) mint előbb, de legfeljebb HOSSZ karakterből álló részt ad vissza
tolower(SZÖVEG) visszaadja a SZÖVEG kisbetűssé konvertált értékét
toupper(SZÖVEG) visszaadja a SZÖVEG nagybetűssé konvertált értékét
getline nev < "-" Standard inputról olvas a nev változóba
Példa no.1:
BEGIN {
szovegem="Kimaxolom az OS 2. ZH-t."
printf("\nAz eredeti szoveg: %s\n\n", szovegem)
print "\"OS\" kezdopozicioja: " index(szovegem,"OS")
print "A szovegem hossza: "length(szovegem)
split(szovegem,T," ")
print "A szovegem helykoz menten darabolva es a T tombe mentve:"
for (i in T){
printf("%s ",T[i])
}
printf("\n")
print "A szovegem az 5. poziciotol: " substr(szovegem, 5)
print "A szovegem az 5. es az (5+4). pozicio kozott: " substr(szovegem, 5, 4)
print "Kisbetusitve: " tolower(szovegem)
print "Nagybetusitve: " toupper(szovegem)
}
Output:
Az eredeti szoveg: Kimaxolom az OS 2. ZH-t. "OS" kezdopozicioja: 14 A szovegem hossza: 24 A szovegem helykoz menten darabolva es a T tombe mentve: Kimaxolom az OS 2. ZH-t. A szovegem az 5. poziciotol: xolom az OS 2. ZH-t. A szovegem az 5. es az (5+4). pozicio kozott: xolo Kisbetusitve: kimaxolom az os 2. zh-t. Nagybetusitve: KIMAXOLOM AZ OS 2. ZH-T.
Példa no.2:
BEGIN {
printf "Irja be a nevet:"
getline nev < "-"
printf "%s kora:",nev
getline kor < "-"
print nev, ", kovetkezo evben " kor + 1 "eves lesz"
}
Numerikus függvények
sin(KIF), cos(KIF) Trigonometria.
sqrt(KIF) Gyökvonás.
exp(KIF), log(KIF) Exponens és logaritmus.
int(KIF) Egésszé konvertálás csonkolással (truncation).
Feladatok:
(A feladatok megoldásai elérhetőek lesznek ugyanitt, a gyakorlatot követő pár napon belül.)
1. Írj szkriptet, amely egy olyan fájlt kap bemenetként, melynek minden sorában tetszőleges számú egész számjegyek vannak, ";"-vel elválasztva. A szkript számolja ki minden sornak az átlagát, külön-külön és írja ki, majd a végén a teljes fájl átlagértékét is írja ki. osA3_01.awk
2. Írj szkriptet, amely paraméterként egy fájlt vár. A fájl az ls -lR parancs egy lehetséges kimenetét tartalmazza. A feladat: Kiírni azon KÖNYVTÁRAK nevét, amelyek az aktuális könyvtárhoz képest pontosan 3 könyvtár mélységben helyezkednek el. osA3_02.awk
3. Bővítsd ki a 2. feladatot úgy, hogy egy könyvtár neve ne jelenjen meg többször, csakis kizárólag egyszer. osA3_03.awk
4. Írj szkriptet, amely az ls -l kimenetéből megszámolja, hogy egyes felhasználók hány állományt hoztak létre! osA3_04.awk Példa input: file_A3_1.txt
Gyakorló óra
#1. 2. ZH minta (Hirling Dominik): 2minta.pdf
#2. 2. ZH minta + megoldás (Berta Árpád): gyakorlas.pdf
#3. 2. ZH minta + megoldás (Cirok Dávid): masodikzh_segedlet.pdf
2. ZH
Javító ZH
JAVÍTÓ ZH KÖZÖS IDŐPONTBAN! TEHÁT NEM VALÓSZÍNŰ, HOGY A GYAKORLAT EREDETI IDEJÉN ÉS HELYÉN! RÉSZLETEK KÉSŐBB.
BASH és AWK kód szintaxis kiemelő stílus csere
Sötét alapon, közepesen világos karakterek.
Fehér alapon, sötét karakterek (Default).