ARCHÍV!

A LEGFRISSEBB ANYAGÉRT KERESD FEL A "Teaching (in Hungarian)" MENÜPONTOT!

Operációs rendszerek gyakorlat 2019-2020/2


Nappalisoknak:

• Részteljesítések, pontszerzési lehetőségek: 2 zárthelyi dolgozat és 2 db órai feladat.

• Első zárthelyi dolgozat: A 7. szorgalmi héten (március 16-tól kezdődő hét)
• Második zárthelyi dolgozat: a 14. szorgalmi héten (május 4-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 4 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.

Levelezősöknek:

Részteljesítések, pontszerzési lehetőségek: 1 zárthelyi dolgozat, 2 db beadandó feladat.

Zárthelyi dolgozat: az utolsó gyakorlati időpontban
A zárthelyi dolgozat időpontja előre rögzített, nem változtatható.
A beadandó feladatok beadási határideje a 14-ik hét (utolsó előtti szorgalmi hét) vasárnap 23:59
A zárthelyi dolgozatokra 40, a beadandó feladatokra 5-5 pontot lehet szerezni.
A zárthelyi feladatok megoldásához csak a helyszínen biztosított elektronikus segédanyag használható.
A zárthelyi dolgozatok és a beadandó 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. 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 40 pont szerezhető. A javítás akkor sikeres, ha a hallgató a javító zh-n legalább 20 pontot szerez. A végső jegy a javító zh pontszámának és a beadott feladatok pontszámának az összegéből lesz képezve. 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

Nappalisoknak:

  1. hét - 02.05. - 02.06. - SZ / CS - L1

  2. hét - 02.12. - 02.13. - SZ / CS - L2

  3. hét - 02.19. - 02.20. - SZ / CS - L3

  4. hét - 02.26. - 02.27. - SZ / CS - B1

  5. hét - 03.04. - 03.05. - SZ / CS - B2

  6. hét - 03.11. - 03.12. - SZ / CS - B3

  7. hét - 03.18. - 03.19. - SZ / CS - 1. zh (20p)

  8. hét - 03.25. - 03.26. - SZ / CS - A1

  9. hét - 04.01. - 04.02. - SZ / CS - A2

10. hét - 04.08. - 04.09. - SZ / CS - A3

11. hét - 04.15. - 04.16. - TAVASZI SZÜNET

12. hét - 04.22. - 04.23. - SZ / CS - gyakorlás

13. hét - 04.29. - 04.30. - SZ / CS - gyakorlás

14. hét - 05.06. - 05.09. - SZ / CS - 2. zh (20p)

15. hét - 05.13. - 05.16. - 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!


Levelezősöknek:

1. alkalom: L és B anyagrészek

2. alkalom: A anyagrészek

3. alkalom: ZH


A nappalis kurzus oktatói:

  • Cservenák Bence, Cservenak.Bence [at] stud.u-szeged.hu . Fogadóóra: egyeztetés alapján
  • Czégel András, Czegel.Andras [at] stud.u-szeged.hu . Fogadóóra: egyeztetés alapján
  • Illés Illés Tamás, Iles.Illes.Tamas [at] stud.u-szeged.hu . Fogadóóra: egyeztetés alapján
  • Kis-Szabó Norbert, ksznorbi [at] inf.u-szeged.hu . Fogadóóra: egyeztetés alapján
  • Kolozsi István Zoltán, Kolozsi.Istvan.Zoltan [at] stud.u-szeged.hu . Fogadóóra: egyeztetés alapján
  • Lakos Bence, Lakos.Bence [at] stud.u-szeged.hu . Fogadóóra: egyeztetés alapján
  • Lékó Gábor, leko [at] inf.u-szeged.hu . Árpád tér 2. 223-as szoba. Fogadóóra: egyeztetés alapján
  • Varga László, vargalg [at] inf.u-szeged.hu . Árpád tér 2. 218-as szoba. Fogadóóra: csütörtök 10:00 - 11:00

Gyakorlataik időpontjai:

  • Szerda 15:00 - 17:00, Kis-Szabó Norbert, Lékó Gábor
  • Szerda 18:00 - 19:00, Czégel András, Lakos Bence
  • Szerda 19:00 - 20:00, Kis-Szabó Norbert
  • Csütörtök 10:00 - 12:00, Cservenák Bence, Kolozsi István Zoltán
  • Csütörtök 12:00 - 14:00, Illés Illés Tamás, Varga László
  • Csütörtök 14:00 - 15:00, Czégel András, Lékó Gábor
  • Csütörtök 15:00 - 16:00, Kis-Szabó Norbert, Lékó Gábor


L1




Követelmények ismertetése

A gyakorlati követelmények megtekinthetőek lesznek a félév folyamán itt a honlapon (Követelmények fül) és CooSpace-en is.


Egyéb hasznos információk

A gyakorlat anyaga elérhető lesz a honlapon.

A Menetrend menüpont részletesen taglalja, hogy melyik héten milyen anyag, esetleg ZH következik.

Az Anyagrészek menüpont segíthet az adott anyagnak adott gyakorlathoz való kötésében.

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 állunk rendelkezésetekre. Az Oktatók menüpontban megtaláljátok az összes gyakorlatvezető elérhetőségét. 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árjuk sok szeretettel, csak jelezze email-ben legkésőbb előző nap (ha túdjátok lehet előbb), hogy szeretne jönni.




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.

A legfrissebb tanulmányok szerint [itt, itt, itt] az alábbi nyelveket érné meg leginkább megtanulni 2020-ban:

Python
Java
C/C++
Javascript
Typescript
C#
Kotlin
Go
Swift
PHP



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

  • Bármelyik parancs után írva kiad nekünk a terminál egy kis segítséget az adott parancs használatáról.


  • pwd

  • (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/OperaciosRendszerek/Nappali/Scriptek/alma ./
    h165057@linux.inf.u-szeged.hu's password:
    alma                                          100%   27     0.7KB/s   00:00
    
    

  • 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/OperaciosRendszerek/Nappali/Scriptek/
    sftp> get alma
    Fetching /pub/OperaciosRendszerek/Nappali/Scriptek/alma to alma
    /pub/OperaciosRendszerek/Nappali/Scriptek/alm 100%   27     0.3KB/s   00:00
    sftp> exit
    sftp>
    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:

        -szám: az első "szám" számú sort írja ki

        -n <-szám>: kiírja a file tartalmát, kivéve az utolsó "szám" mennyiségű sort.


  • tail [kapcsoló]<fájl>

    *
  • Kiírja a fájl a bizonyos sorait a képernyőre.

        -szám: az utólsó "szám" számú sort írja ki

        -n <+szám>: a "szám"-adik sortól kezdve ír 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$
    



Feladatok:

1. Adott egy .csv fájl, mely pontosvesszővel elválasztva tartalmazza hallgatók adatait. Írasd ki, hogy hány különböző szak jelenik meg a dokumentumban. A feladatot csővezeték segítségével oldd meg!

Input fájl (file.csv). A fejléc mutatja, hogy milyen attribútumok vannak.

Nev;Neptun;Szak;Kor;Evfolyam
Bela;AAA;PTI;18;1
Geza;ASD;MI;20;2
Jonas;SKL;PTI;25;1
Ede;LGA;PTI;22;3
Dezso;QWE;MI;21;2

Megoldás:
  • Az első sor csak a fejléc, az csak zavarná a statisztikát, úgyhogy csak az azon kívüli sorokat vegyük.

  • lekogabi@lekogabi:~/Dokumentumok$ cat file.csv | tail -n +2
    

    Output:

    Bela;AAA;PTI;18;1
    Geza;ASD;MI;20;2
    Jonas;SKL;PTI;25;1
    Ede;LGA;PTI;22;3
    Dezso;QWE;MI;21;2
    
  • A szakok a 3. oszlopban találhatóak, úgyhogy válogassuk le pontosvessző mentén minden sorból a 3. mezőt.

  • lekogabi@lekogabi:~/Dokumentumok$ cat file.csv | tail -n +2 | cut -d ";" -f 3
    

    Output:

    PTI
    MI
    PTI
    PTI
    MI
    
  • Ahhoz, hogy meg tudjuk számolni, hogy hány egyforma szakunk van, először is el kellene intézni valahogy, hogy mindegyikből csak egy példány maradjon. Ehhez pedig előbb sorba kell őket rendezni, hogy az egyforma szakok egymás alá kerüljenek:

  • lekogabi@lekogabi:~/Dokumentumok$ cat file.csv | tail -n +2 | cut -d ";" -f 3 | sort
    

    Output:

    MI
    MI
    PTI
    PTI
    PTI
    
  • Mostmár egyetlen paranccsal eltüntethetjük az egymás után lévő duplikátumokat.

  • lekogabi@lekogabi:~/Dokumentumok$ cat file.csv | tail -n +2 | cut -d ";" -f 3 | sort | uniq
    

    Output:

    MI
    PTI
    
  • Már csak egyetlen dolgunk maradt, megszámolni, hogy hány soros az előző outputunk és kész is vagyunk.

  • lekogabi@lekogabi:~/Dokumentumok$ cat file.csv | tail -n +2 | cut -d ";" -f 3 | sort | uniq | wc -l
    

    Output:

    2
    
  • Tehát a feladat megoldása: 2



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. Használjunk aposztrófokat az illetsztett kifejezés körül (' ').

    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>

  • Kiírja, hogy kik vannak bejelentkezve az aktuális gépre.

    felhasználó: a megadott felhasználóról ír ki adatokat.


  • who

    *
  • Kiírja, hogy kik vannak bejelentkezve az aktuális gépre, plusz adatokat ír ki a finger-hez képest.


  • whoami

    *
  • Aktuális felhasználó azonosítójának kiírása.


  • groups

  • Aktuális felhasználó csoportjának kiírása.


  • passwd

  • Aktuális felhasználó jelszavának beállítása (root bárkiét beállíthatja).


  • w

  • 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.





Feladatok:

Cservenák Bence és Kolozsi István összefoglaló feladatai az L1-L2-L3 órákhoz:

  • Feladatok:

  • A scores.csv állomány egy online játék állását tartalmazza. Minden sorban pontosvesszővel elválasztva szerepel: a játékos neve, a játékos állapota (online/offline), valamint a játékos által elért pontszám.
    
    1. Írasd ki a játékosok neveit ábécé sorrendben!
    
    2. Hány játékos adatait tartalmazza az állomány? (12)
    
    3. Mekkora a legnagyobb elért pontszám? (9768)
    
    4. Írasd ki az online játékosok nevét!
    
    5. Szúrjuk be a fájl végére a következő sorokat!
    
    szeklab;online;9852
    TheRealMB012;offline;1024
    KubaTheReal0007;online;8234
    
    6. Hány olyan játékos van, akinek a nevében szerepel a "TheReal" string vagy offline? (8)
    
  • Tesztfájl: scores.csv

  • Megoldás: pipeline_megoldas.pdf



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

    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
    



    Kiegészítés IF-hez: ha csak egyszerű, kifejezések közti összehasonlításra (aritmetikai kifejezés) van szükség, akkor [[ ]] helyett használhatjuk a (( )) zárójel párost. Ez a verzió ugyanis az egyszerű matematikai operátorokat is ugyanúgy tudja értelmezni, mint az eddig látott magasabb szintű programozási nyelvek, ill. nem érzékeny a helyközökre: Pl.:

    
    #!/bin/bash
    
    if (( 8 < 9 )) ; then
        echo "Nyolc kisebb, mint kilenc."
    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
    

    
    # Az alabbi script vegig megy az osszes .txt kiterjesztesu fajlon az adott mappaban
    #!/bin/bash
    
    for param in $(ls *.txt) ; 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.


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



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.
  • Ismételt illesztés, ismétlésszám megadása, iteráció (repetition, iteration):

  • 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)
  • Műveleti erősség csökkenő sorrendben: iteráció, konkatenáció, alternáció.





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

    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.

  • 1. Beleirányítjuk az "ls -l"-t egy fájlba, majd azt használjuk bemeneti paraméterként:

  • 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

    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.

  • Saját változó:

    • NÉV=ÉRTÉK

    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 – Number 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 (SZERK: Program javítva. 2020.04.18.)



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

domain.csv

osztalyzatok.csv


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).