Unix-Linux alapok II. gyakorlatvezető: Lutár Patrícia Ez a dokumentum az órán bemutatott alapparancsoknak egy vázlatos áttekintése. A parancsokhoz tartozó kapcsolók/opciók (flagek) felsorolása nem teljes. Az elérhető összes információ a manuálban található, amiben egy adott parancsnévhez tartozó ismertetőt a „man *paracsnév+” paranccsal lehet lekérdezni.
1. GREP parancs „Karaktersor (szó vagy minta) keresése egy fájlban” A grep a paraméterként megadott fájlokra vagy a standard input-ra illeszt szabályos kifejezéseket. grep mit filenév (ha a mit szóközt tartalmaz akkor ' vagy ” közé) Példa1: Keresd meg a /etc/motd.karacsony fileban a ‘Karacsony’ karaktersort tartalmazó sorokat! (grep Karacsony /etc/motd.karacsony) A grep alapértelmezésben érzékeny a kis- és a nagybetűk közötti különbségre, idegen szóval case-sensitive. Ezt az alapértelmezett működést azonban felül lehet bírálni a -i kapcsolóval: grep -i karacsony /etc/motd.karacsony Példa2: grep -r feladatsor ~/infokez2/ (rekurzívan adott mappán belül a fileokban keres) grep -lr feladatsor ~/infokez2/ (ugyanaz mint az előző, ám csak kilistázza a fileneveket) Példa3: -v kapcsoló : Mintára nem illeszkedő sorok listázása -w kapcsoló: Teljes szavas illeszkedés -n kapcsoló: A file-on belüli sor „száma”, amire az illeszkedés jó volt. Reguláris kifejezések használata a GREP-ben: Az elemi építőkövek olyan szabályos kifejezések, melyek egyetlen karakterhez illeszkednek. A legtöbb karakter (pl. a betűk és a számok) szabályos kifejezések, melyek önmagukhoz illeszkednek. A speciális jelentéssel rendelkező metakarakterek (pl. a ., *, [ karakterek) elé backslash-t kell írni, hogy speciális jelentésük helyett a karakterhez való illeszkedést vizsgálhassuk. (Pl. a mintában levő \[ fog illeszkedik a szövegbeli nyitó szögletes zárójellel.) A [ és ] jelek közé írt karakterlista illeszkedik a listában szereplő bármely karakterhez. Amennyiben a lista a ^ jellel kezdődik, az illeszkedés a listában nem szereplő karakterekkel áll fenn. Például a [0123456789] szabályos kifejezés bármely számjegyhez illeszkedik.
ASCII karakterek tartománya az első és utolsó karakterek megadásával adható meg, ha ezeket `-' jel választja el. (Pl. [a-f] ugyanaz, mint[abcdef].) Végül a karakterek néhány speciális osztálya előre definiált névvel rendelkezik. (Ezen nevek jelentése angolul magától értetődő, itt kifejtjük őket.) [:alnum:] betű vagy szám [:alpha:] betű [:cntrl:] vezérlőkarakter [:digit:] számjegy [:graph:] grafikus karakter [:lower:] kisbetű [:print:] nyomtatható karakter [:punct:] elválasztó, központozó jel (.,;?!) [:space:] szóköz [:upper:] nagybetű [:xdigit:] hexadecimális szám Például [[:alnum:]] jelentése: [0-9A-Za-z], azzal a kitétellel, hogy az utóbbi forma az ASCII kódolástól függ, míg az előbbi nem, így átvihető. A legtöbb metakarakter elveszti speciális jelentését egy listán belül. Egy ] jelet a minta első elemeként szerepeltetve csatolhatunk a listához. Hasonlóan a ^ jel az első kivételével bármely helyre kerülve a `^' jelet fogja jelenteni. Végül a `-' jelet a lista utolsó elemeként kell írni, ha nem metakarakterként akarjuk értelmezni. A pont ( . ) minden karakterhez illeszkedik. A \w szimbólum az [[:alnum:]] szinonímája, míg \W ugyanaz, mint [^[:alnum:]]. A ^ és a $ jelek metakarakterek, melyek rendre a sorkezdő és sorzáró üres stringekhez (karaktersorozatokhoz) illeszkednek. Hasonlóan a \< és \> szimbólumok a szavak elejénél illetve végénél található üres stringhez illeszkednek. A \b a szóhatáron levő üres stringhez illeszkedik, míg \B a nem szóhatáron levő üres stringhez illeszkedik.
Az egy karakterhez illeszkedő szabályos kifejezéseket a következő ismétlési operátorok egyike követheti: ? Az előző tag opcionális, és legfeljebb egyszer illeszkedik. * Az előző tag nulla vagy több alkalommal illeszkedik. + Az előző tag egy vagy több alkalommal illeszkedik. {n} Az előző tag pontosan n alkalommal illeszkedik. {n,} Az előző tag n vagy több alkalommal illeszkedik. {,m} Az előző tag legfeljebb m alkalommal illeszkedik. {n,m} Az előző tag legalább n de legfeljebb m alkalommal illeszkedik. Két szabályos kifejezés összefűzhető; a kapott szabályos kifejezés minden olyan stringhez illeszkedik, amely a két szabályos kifejezéshez illeszkedő két részstringből állítható össze a sorrend megtartása mellett. 2. PS parancs A legtöbb Unix-támogató operációs rendszerben a ps program kilistázza az aktuálisan futó folyamatokat. Egy másik Unix parancs a top, amely valós időben írja ki a futó folyamatokat. Példa4: ps -aux (minden futó processz/folyamat információjának kiírása BSD szintaxis szerint) Példa5: ps -ef (minden futó processz/folyamat információjának kiírása a standard szintaxis szerint. Használjátok ezt, mert azt is kiírja, hogy melyik ProcessID-jú (PID) folyamatnak, mely az úgynevezett „szülő folyamata” (Parent ProcessID – PPID), amiből meghívtad azt a processzt.) Ha csak annyit futtatsz, hogy „ps”, akkor az aktuális shell-ed futó processzeit mutatja, de a fentiekkel az összes shell-ed processzeit látod. Mi is az a ProcessID (PID)? Minden folyamatnak van egy egyedi azonosítója, ami addig „él”, amíg az a folyamat nem terminál (azaz szabályosan be nem fejezi a működését), vagy amíg nem kap egy olyan utasítást, hogy fejezze be a működését „ott, ahol van” (azaz ne szabályosan álljon meg, hanem megszakítással). Ez az azonosítószám teljesen egyedi, más processz nem kaphatja meg addig, amíg egy processznek ki van osztva. 3. Programok indítása előtérben: <parancsnév+paraméterek> Ez a szokásos, ahogyan egy parancsot meghívsz/elindítasz/futtatsz. Pl. „man ps”, ami a ps parancsról szóló leírást tartalmazza, és mutatja meg nekünk. De nem csak így lehet parancsot/scriptet futtatni. Lásd következő pont. --> háttérben: <parancsnév+paraméterek> & Ennek az a lényege, hogy a parancsod végére odaraksz egy „&” (alt gr + c) jelet. Ez azt csinálja, hogy a meghívott parancsod nem veszi el a prompt-odat, hanem ehelyett a „háttérben” kezd el futni.
Példa6: goth@pandora:~$ man ps & [1] 28261 goth@pandora:~$ Tehát a „man ps”-t háttérben futtatom, majd visszakapom a promptomat. Az első [] között levő szám az úgynevezett JobID. Ez is egy azonosítója a processzemnek, ám ez csak az adott shellemen belül egyedi, nem rendszerszinten. A második szám pedig a fentebb említett PID, ami már rendszerszinten egyedi. Tehát ha ezután egy másik shell-en keresztül bejelentkezek, akkor a PID-del tudok rá hivatkozni, noha nem abból a shell-ből indítottam el a parancsot! 4. Processzek kezelése, szignálok jobs: belső feladatazonosítók, állapotok lekérése jobs -l : a folyamatok azonosítóját is kiírja kill: folyamatok leállítása SIGTERM szignál küldése egy processznek háromféle módon: Ezzel kényszerítem a processzemet szabályos leállásra, azaz „termináljon”. (A példában a processzem PID-je 1234, JobID-ja meg 3.) kill 1234 kill -TERM 1234 kill -15 1234 kill -TERM %3 kill -15 %3 kill %3 (Ezek a parancsok felül mind ugyanazt csinálják.) SIGKILL szignál küldése egy processznek kétféle módon: Ezzel kényszerítem a processzemet megszakításra. kill -KILL 1234 kill -9 1234 kill -KILL %3 kill -9 %3 (Ezek a parancsok felül mind ugyanazt csinálják.) Azt, hogy egy processz az „előtérben” vagy a „háttérben” fusson, nem csak az indításnál tudom megtenni, hanem a futás közben is tudom ezt módosítani, ha lehetőségem van rá. Ha visszakapom a promptomat futás közben, akkor a következő két parancsot tudom használni bg [JobID] – háttérbe küldés fg [JobID] – előtérbe hozás Feladat: Lépjünk be két terminál kapcsolattal, egyik ablakban indítsunk el egy szövegszerkesztőt, majd ezt lőjjük ki a másik ablakból! (Csak nehogy a saját shell-ünket :-))
5. Processzek befagyasztása, folytatása ^c (CTRL+C): véglegesen leállítja az aktuális programot (INT(2) szignál) Futó folyamat befagyasztása: CTRL + Z Példa7: sleep 100 CTRL + Z ps -af 6. PIPE-olás/Szűrés (pipe = csővezeték) A „|” (alt gr + w) a pipe-olás karaktere, az elõtte lévő parancs standard kimenetét átirányítja a következő parancs standard bemenetére. Erről már volt szó a Windows-os Command Prompt esetében is. :-) Feladat1: Megoldás:
Adjuk meg azokat a fileokat a home-unkban, amire van futtatási jogosultságunk! ls -l ~| grep '^-..x'
Megoldáshoz vezető út: Jogosultságok? → Az ls parancs megfelelő kapcsolójával... A Home-om, micsoda? → ~ -ként tudsz rá hivatkozni, ha nem éppen a home-od az aktuális munkakönyvtárad... (ls -l ~) Oké, és most hogyan szűrjem ki azokat a file-okat, amikre van futtatási jogom? → Mivel tanultad, hogy a jogosultságoknál a „-” jelöli azt, hogy egy file-ról van szó, első sorban erre kell szűrnöd, mert a mappák és a linkek nem érdekelnek... Azután pedig az első „rwx” csoport kell neked, mert a Te jogaidról van szó, és ebből is az x jogot kell vizsgálni (execute, futtatás). Mit kell csinálnom, hogyan szűrjem ezeket ki? → grep paranccsal, és egy jó kis reguláris kifejezést adj neki mintaként. Mi legyen a mintám? → a sor elejére illeszkedjen (^) az, hogy file legyen (-) majd két bármilyen karakter legyen, amit úgy tudsz megadni, hogy a reguláris kifejezéseknél a „.” helyettesít egy tetszőleges karaktert, tehát két pontot írsz (..), ami két teszőleges karaktert helyettesít, és kell ezután az, hogy futtatási jog legyen (x). Tehát a mintád: '^-..x' 7. TEE parancs A tee parancs a standard bemenetén kapott adatokat a standard kimenentre é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. Opciók -a, --append (A standard bemenet tartalmát a célfájlok végéhez fûzi, és nem írja felül azokat.) -i, --ignore-interrupts (Figyelmen kívül hagyja a megszakításra vonatkozó jelzéseket.)
Példa8: ls -l | tee file.txt | less Ez azt csinálja, hogy annak a munkakönyvtárnak a tartalmát, amiben vagyunk kilistázza úgy, hogy a file.txt -be belemásolja azt, amit eredményez az „ls -l” utasítás, de a less parancsnak továbbítja még ezt az eredményt. A szemléltető ábra a Wikipédiáról van. 8. WC parancs Ez a parancs vagy a standard input-ról vagy a megadott bemeneti fájlokból olvas, és különböző statisztikai információkat ír a kimenetre. Több bemeneti fájl esetén összesített és fájlonkénti statisztikát is kapsz a standard output-on. Opciók -l csak a sorok száma: wc -l
-c csak a byte-ok száma: wc -c -m csak a karakterek száma: wc -m -L a leghosszabb sor hossza: wc -L -w csak a szavak száma: wc -w 9. UNIQ parancs Használat: uniq Összevonja az egymást követő azonos sorokat. Opciók -c : minden sor elé kiírja, hogy valójában ott hány sor állt a bemenetben Példa9: goth@pandora:~/peldak$ cat peldatext.txt alma alma alma béka béka alma goth@pandora:~/peldak$ uniq peldatext.txt alma béka alma
goth@pandora:~/peldak$ uniq -c peldatext.txt 3 alma 2 béka 1 alma goth@pandora:~/peldak$ cat peldatext.txt | uniq -c 3 alma 2 béka 1 alma 10. SORT parancs Használat: sort Rendezi a megadott file sorait, alapértelmezésben ABC szerinti növekvő sorrendben. Opciók -r : csökkenő sorrend -n : a sorok elején található számok alapján Példa10: goth@pandora:~/peldak$ sort -r peldatext.txt béka béka alma alma alma alma goth@pandora:~/peldak$ cat peldatext.txt | uniq -c | sort -nr 3 alma 2 béka 1 alma 11. CUT parancs A cut egy Unix parancs, melyet arra használunk, hogy egy megadott állományból kiszedjünk bizonyos részeket, pl. bizonyos számú karaktereket, szavakat. Ha azt szeretnénk, hogy mindegyik sorából kiírasuk a 4-től 10-ig levő karaktereit használjuk a következő utasítást: cut -c 4-10 file Ha az 5. szótól kezdődően akarjuk kiíratni minden sor tartalmát, felhasználva azt, hogy a szóelválasztó karakter a ":" , akkor a következő kell használjuk: cut -d : -f 5- file
Példa11: (Az előzők bemutatása) goth@pandora:~/peldak$ cat cut_pelda.txt foo:bar:baz:qux:quux one:two:three:four:five:six:seven alpha:beta:gamma:delta:epsilon:zeta:eta:teta:iota:kappa:lambda:mu goth@pandora:~/peldak$ cut -c 4-10 cut_pelda.txt :bar:ba :two:th ha:beta goth@pandora:~/peldak$ cut -d : -f 5- cut_pelda.txt quux five:six:seven epsilon:zeta:eta:teta:iota:kappa:lambda:mu Feladat2: Kilistázni, ki hányszor lépett be a pandora szerverre? Megoldás: who | cut -f1 -d " " | sort | uniq -c Megoldáshoz vezető út: Kik vannak bejelentkezve? → who... Nekem csak a felhasználónevek kellenek! → Vágjuk ki az első oszlopot... Hogyan vágjam ki? → cut paranccsal, ahol az elválasztó karakter a szóköz (látod, a who eredményében), és ebből az első oszlop kell, azaz minden sorra az első mező, ahol a mezől elválasztása a szóközzel történik! goth@pandora:~/peldak$ who | cut -d " " -f 1 goth marian wow kunmarto nlcs holes_a goth nlcs sp1r1t Hogyan számolom ebből össze, hogy ki hányszor? → A uniq-nak van megfelelő kapcsolója, és az egymás alatt levő azonos sorokat tudja összegezni.. Ez így nem jó, mert a goth és a nlcs felhasználók így többször benne lesznek, és nem összegzi be a uniq.... → Először rendezd be őket egy sort-tal, úgy már működik!
goth@pandora:~/peldak$ who | cut -d " " -f 1 | sort goth goth holes_a kunmarto marian nlcs nlcs sp1r1t wow goth@pandora:~/peldak$ who | cut -d " " -f 1 | sort | uniq -c 2 goth 1 holes_a 1 kunmarto 1 marian 2 nlcs 1 sp1r1t 1 wow Működik :-)