7. Szűrők¶
Az előző fejezetben megmutattam, hogy hogyan tudod egy parancs kimenetét egy másik bemenetére átirányítani, és így egy csövet (pipe-ot) létrehozni. A Unix rendszerek több parancsot tartalmaznak, amelyeket leginkább erre a működtetésére terveztek – közös jellemzőjük, hogy a bemenet sorait olvassák, azon valamilyen feldolgozást végeznek, és ennek eredményét a kimenetre írják. Ezeket a parancsokat ezért egy összefoglaló néven is említik, ezek a szűrők.
Lássuk, melyek ezek, és milyen feladatokat oldhatsz meg velük! A példák során gyakran az /etc/passwd
fájlt fogom használni forrásként, mivel már ismered a felépítését.
7.1. grep¶
A grep a bemenetére érkező sorokból azokat írja a kimenetre, amelyek a paramétereként megadott szöveget tartalmazzák (vagy éppen nem, de erről mindjárt). A példában a /etc/passwd
soraiból csak azokat jelenítem meg, amelyek tartalmazzák a nevemet:
feri@columbo:~/demo$ cat /etc/passwd | grep feri
feri:x:1158:1158:Koczka Ferenc,,,:/home/feri:/bin/bash
Ismételjük át még egyszer, mi is történt! A cat /etc/passwd a /etc/passwd
fájl tartalmát a standard outputra másolja. Mivel ezt a parancsot egy | karakter követte, ezért ez nem a terminál képernyőjére kerül, hanem az azt követő parancs, a grep szűrő bemenetére. A grep-nek egy paramétere van, az a minta, amelyet tartalmazó sorokat a standard outputra kell másolnia (másképp fogalmazva tovább kell engednie). A grep tehát folyamatosan olvassa a bemenet sorait (amit a cat-tól kap), és ha talál köztük olyat, amiben szerepel a feri
string, akkor azt a standard outputra írja. Az eredmény példánkban az az egy sor, amely tartalmazza a keresett szöveget.
A grep működése sok paraméterrel finomítható.
A keresés során a program megkülönbözteti a kis- és a nagybetűket. Ez sokszor probléma, ha nem vagy biztos abban, hogy pontosan hogyan is írták a keresett szöveget. Ha nem akarod, hogy a grep így működjön, használd a -i kapcsolóját! A példában látható, hogy a -i nélkül nincs találat, míg használatával a kisbetűvel írt szöveg is megjelenik a kimeneten.
feri@columbo:~/demo$ cat /etc/passwd | grep FeRi
feri@columbo:~/demo$ cat /etc/passwd | grep -i FeRi
feri:x:1158:1158:Koczka Ferenc,,,:/home/feri:/bin/bash
Ha épp azokra a sorokra vagy kíváncsi, amelyek nem tartalmazzák a keresett mintát, a -v kapcsolót kell használnod. Ebben a példában megkeressük azokat a felhasználókat, akiknek nem bash
a shellje! (Ezen még lehetne finomítani, mert a megoldás során most feltételeztem, hogy csak a shell kapcsán fordulhat elő a bash szó a sorokban. Ha valakinek a nevében szerepelne ez a szó, akkor az az is megjelenne a találatok közt.)
feri@columbo:~/demo$ cat /etc/passwd | grep -v bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
A grep mintájában jelölheted a sor elejét és végét, ehhez a ^, illetve a $ karaktereket kell használnod. Az előbbi a sor elejét, az utóbbi a sor végét jelenti. Így az előző feladat helyes megoldása a cat /etc/passwd | grep -v bash$ lett volna, ahol a bash$
jelentése az, hogy a sor bash-re végződik.
(A teljesen biztos módszer a cat /etc/passwd | grep -v :/bin/bash$ lenne.)
Hasonlóan kell használni a ^ karaktert is, a ^bela
csak a bela szöveggel kezdődő soroknak felel meg, azoknak, amelyek belsejében szerepel a keresett szó, már nem.
Egy érdekes alkalmazása ennek a két módosító karakternek az üres sorok leírása. A ^$ szó szerinti jelentése az, hogy a sor elejét azonnal a vége követi, azaz üres sorról van szó. Egy fájl tartalmának megjelenítése az üres sorok nélkül tehát így történik: cat <file> | grep -v ^$.
A grep nem csak előre meghatározott szövegrészeket képes keresni, hanem ún. reguláris kifejezésekkel is tud dolgozni. A reguláris kifejezésekről máshol is tanulhattál, egy olyan szöveget jelent, amely egy vagy több más szövegnek való megfelelés szabályait írja le. Lássunk néhány példát!
- grep «[ABC]»:
csak a szögletes zárójelben szereplő karaktereket tartalmazó sorok mennek át a grep szűrőjén.
- grep «[A-Z]»:
így tartományt adhatsz meg. A grep ebben az esetben csak azokat a sorokat jeleníti meg, amelyek tartalmaznak nagybetűt.
- grep «[A-Za-z0-9]»:
a fentiek kombinálhatók, ebben a példában a grep szűrőjén az angol ábécé betűit, vagy számjegyeket tartalmazó sorok mennek át.
- grep «[A-Za-z0-9_-]+@[A-Za-z0-9_-]+.[A-Za-z]+»:
ezt csak kedvcsinálónak mutatom meg, ez a reguláris kifejezés egy általános <valami>@<valami>.<valami> formájú stringet, azaz egy e-mail címet ír le. Az első részben látható [A-Za-z0-9_-]+ azt jelenti, hogy a megtalált szövegnek legalább egy betűt, számot, aláhúzás karaktert vagy kötőjelet kell tartalmaznia. A + jelentése, hogy ebből legalább egy kell, de több ilyen is állhat egymás után. A @ egy kötelezően szereplő @ karaktert jelent. Ez után megint több karakter állhat, amit így írtunk le: [A-Za-z0-9_-]+. Az e-mail címben ezt egy pontnak kell követnie, ami sajnos egy reguláris kifejezésben mást jelent, ezért ezt (ahogyan a programozás órákon már tanultad) egy ` karakterrel kell védened, így az valóban a pont karaktert fogja jelenteni. A pont után már csak kis- és nagybetűket tartalmazó karakterek állhatnak, ezt a :command:`[A-Za-z]+ rész definiálja. A kifejezésen még lehetne finomítani, pl. meghatározhatnánk, hogy az utolsó rész maximum 5 karakter hosszú lehet, de ettől tekintsünk most el, ez elég bonyolult példa így is.
A grep elég sok egyéb képességgel rendelkezik, érdemes átfutnod a leírását a man grep paranccsal.
Javaslat
A reguláris kifejezések eléggé bonyolult téma, ráadásul nyelvenként eltérő is, de ha ebben a szakmában akarsz dolgozni, érdemes megtanulnod. A Unix parancssora mellett találkozhatsz vele a különböző programozási nyelvekben és az adatbáziskezelő rendszerekben is, az ismerete sok esetben nagyban lerövidíti az adott feladat elvégzéséhez szükséges időt.
7.2. A cut¶
A cut parancs a bemenetére érkező sorokból a paramétereinek megfelelően fog kivágni darabokat, és azokat továbbítja a kimenetére. Akkor szoktam használni, ha nincs szükségem a teljes sorra, csak egy részletére.
Azt már láttad, hogy az /etc/passwd
mezőkre van osztva, és a mezőelválasztó karakter a :
. Ezért, ha pl. a felhasználók teljes nevére van szükséged, akkor a sort kettőspontok mentén kell felvágnod, és az így kapott szeletekből az ötödiket kell a kimenetre másolni. Ehhez a cut parancsnak két paramétert kell átadni, az elválasztó karaktert a -d után (delimiter), a mező sorszámát a -f (field) után. Nézd meg az alábbi példát!
feri@columbo:~$ cat /etc/passwd | cut -d : -f 5
Ácsfalvi Annamária
André Mihály
Aranyi Balázs
Arany László
Bagi Attila
Bakó Gábor
A parancs kettőspontok mentén minden sort felszeletelt, és az ötödik mezőt írta a kimenetére.
A -f paraméter után mezőt is meghatározhatsz.
Vesszővel elválasztva több mezőt is felsorolhatsz, ekkor ezek mindegyike a kimenetre kerül. Pl. a cut -d : -f 1,2,5 hatására a második, harmadik és az ötödik mező kerül a kimenetre.
Kötőjellel elválasztva tartományt adhatsz meg, így a felsorolás egyszerűbb lehet: a cut -d : -f 2-4 eredményeként a második, harmadik és negyedik mező kerül a kimenetre.
A fentiek kombinálhatók, a cut -d: -f 1,2-4,7 végrehajtása során az első, második, harmadik, negyedik és hetedik mező kerül a kimenetre.
A cut szűrőnek van egy másik üzemmódja is, ekkor nem mezőelválasztó mentén bontja fel a bemenetére kerülő sor tartalmát, hanem egyszerűen karakter pozíciókat adhatunk meg. Ekkor a -d helyett -c kapcsolót kell használnod, és meg kell adnod a kivágni kívánt terület kezdetét és végét. Így a cut -c 1-8 az első karaktertől a nyolcadikig fogja kivágni a sor tartalmát. (A cut esetében a karakterek számozása egytől kezdődik.)
feri@columbo:~$ cat /etc/passwd | cut -c 1-8
FBGTTN:x
J3TLDK:x
QESVL1:x
KIV2R4:x
HQHZD8:x
PFILFB:x
FVFFDZ:x
WK72JW:x
W2VDDU:x
Y0EI4L:x
Ez az alkalmazási mód a gyakorlatban sokkal kevesebb alkalommal fordul elő, a mezőkre bontott fájl alkalmazása a jellemző. A teljesség kedvéért: a -c után itt is több lehetőséged van:
A -c 3 jelentése: a harmadik karakter.
A -c 1,3,5 az első, harmadik és ötödik karaktert adja vissza.
A -c 10-20 jelentése a tizediktől a huszadik karakterig.
A -c 10- jelentése: a tizedik karaktertől a sor végéig.
A fentiek ebben a módban is kombinálhatók, ez a paraméter is helyes: -c 1,3,8-12,17-21
7.3. A wc¶
A wc jelentése word count, de a jelentésével ellentétben nem csak szavak, hanem karakterek és sorok megszámolására is képes. Ezt a szűrőt olyan feladatok megoldása esetén használjuk, amely során valamilyen darabszámra vagyunk kíváncsiak.
A wc használata egyszerű, tulajdonképpen egy paramétert szoktam adni neki attól függően, hogy a bemenetére került karakterek, szavak, vagy sorok számára vagyok kíváncsi. A wc -c a karakterek, a wc -w a szavak, a wc -l a sorok számát írja ki (Chars, Words, Lines). Paraméterek nélkül a wc mindhármat megjeleníti.
Példa: hány sora van a /etc/passwd fájlnak?
feri@columbo:~$ cat /etc/passwd | wc -l
558
7.4. A head és a tail¶
A gyakorlati munkában szükség lehet arra, hogy egy fájl első, vagy utolsó néhány sorát jelenítsd meg, vagy továbbítsd a szűrők csövében. Ezekre való a head és a tail parancs.
A működésük hasonló, a különbség annyi, hogy a head az első sorokat, a tail az utolsókat írja a kimenetre. Alapértelmezésben ez 10 sor, de a -n paraméterrel el módosítható. Az alábbi példában a /etc/passwd
fájl első öt sorát jelenítjük meg:
feri@columbo:~$ cat /etc/passwd | head -n 5
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
7.5. A sort¶
A bemenet sorainak rendezésére a sort szűrőt kínálják a Unix rendszerek. Ez a bemenetére érkező sorokat ábécé szerint rendezi, és a kimenetre írja. Az alábbi parancs a /etc/passwd
fájl sorait ábécérendben jeleníti meg:
feri@columbo:~$ cat /etc/passwd | sort
ZA3C7Z:x:2089:2090:Szabó Lajos:/home/2017/ZA3C7Z:/bin/bash
ZARGIW:x:1908:1909:Szabó Zoltán:/home/2016/ZARGIW:/bin/bash
ZAHHIY:x:2166:2167:Kovács András Péter:/home/2017/ZAHHIY:/bin/bash
ZALIQU:x:1571:1572:Szanyiszló László:/home/2016/ZALIQU:/bin/bash
ZAEPP4:x:2376:2378:Terpesi Anna:/home/2018/ZAEPP4:/bin/bash
A sort a számokat alapértelmezésben nem fogja helyesen rendezni, ehhez egy paramétert kell használni. Ha kipróbálod a cat /etc/passwd | cut -d : -f 3 | sort parancsot, látható lesz, hogy a megjelenített felhasználói azonosítók számok, és a sorrendjük hibás. Ennek az az oka, hogy a sort alapértelmezésben szöveges rendezést végez, mely során a 100 kisebb lesz, mint a 2, hiszen az első karakterek összehasonlításakor az 1<2 feltétel teljesül. A numerikus rendezés igényét a -n paraméterrel kell jelezni a parancsnak. Az alábbi szűrő már a kívánt eredményt adja:
feri@columbo:~$ cat /etc/passwd | cut -d : -f 3 | sort -n
0
1
2
3
4
5
6
7
Alapértelmezésben a sort növekvő sorrendben rendez, ha csökkenőt szeretnél, akkor használd a -r kapcsolót.
feri@columbo:~$ cat /etc/passwd | cut -d : -f 3 | sort -n -r
65534
2409
2408
2407
2406
2405
2404
2403
2402
Javaslat
Az operációs rendszer nyelvi és területi beállításától függ a magyar ékezetes karakterek szerinti rendezés helyes működése. Ha ezt a magyar magyarra állították be, akkor a rendezés is a magyar nyelv szabályai szerint működik, ha azt tapasztalod, hogy a magyar ékezetes betűk a lista végére kerültek, minden bizonnyal az operációs rendszer nyelvi és területi beállításaiban kell keresned a hiba okát.
7.6. A uniq¶
Ez a szűrő a bemenetére érkező azonos sorokból csak egyet fog a kimenetére engedni, az összes többit elnyeli. Ennek megfelelően akkor kell használni, ha egy sokaságból az ismétlődő elemekre nincs szükségünk, mindegyiket csak egyszer akarjuk feldolgozni.
Ha neked kellene megírni a uniq programját, a megoldásod valószínűleg egy asszociatív tömbön, vagy egy láncolt listán alapulna azért, hogy az ismétlődő elemeket ki tudd szűrni. A nagy listák feldolgozásához ezért nagy memória kellene, így ez nem optimális megoldás, és a uniq nem is így működik. Sokkal egyszerűbb a helyzet akkor, ha a bemenet rendezett, ekkor mindig csak azt kell ellenőrizni, hogy az éppen olvasott sor azonos-e az előzővel, és ha igen, azt már el kell dobni. Így az egymás után ismétlődő sorokból csak az első kerül a kimenetre, és mivel nem szükséges a korábban olvasott sorokat tárolni, nincs szükség nagy memóriára sem.
A uniq így működik, ezért a bemenetére kerülő soroknak mindig rendezettnek kell lenniük, amit úgy biztosítható, hogy azt mindig megelőzi egy sort szűrő.
Példa: Milyen különböző parancsértelmezők van az /etc/passwd
fájlban? A válaszhoz minden shellt csak egyszer kell megjeleníteni, amire a uniq szűrőt használjuk.
feri@columbo:~$ cat /etc/passwd | cut -d : -f 7 | sort | uniq
/bin/bash
/bin/false
/bin/sh
/bin/sync
/usr/sbin/nologin
Megjegyzés
A uniq fenti funkcióját egyébként a sort -u parancs is megvalósítja, így helyes lett volna a cat /etc/passwd | cut -d : -f 7 | sort -u használata is.
7.7. A tr¶
A tr szűrő a bemenetére érkező sorokban keresést és cserét végez, de nem úgy, ahogyan azzal a legtöbb nyelvben találkozol: itt csak egyes karakterek, és nem szövegrészletek cserélhetők. Például cserélheted az összes a
betű előfordulását k
-ra, de nem tudod lecserélni vele a Balog nevű felhaszálókat Balogh-ra.
A parancsnak a fentiek értelmében két paramétert kell adni, a keresendő karakterek listáját, és azt, hogy ezeket mire kell cserélni. Az alábbi példában az a-kat k-ra, a b-ket l-re, a c-ket t-re cseréli a tr:
feri@columbo:~$ cat /etc/passwd | tr 'abc' 'klt'
root:x:0:0:root:/root:/lin/lksh
dkemon:x:1:1:dkemon:/usr/slin:/usr/slin/nologin
lin:x:2:2:lin:/lin:/usr/slin/nologin
sys:x:3:3:sys:/dev:/usr/slin/nologin
synt:x:4:65534:synt:/lin:/lin/synt
gkmes:x:5:60:gkmes:/usr/gkmes:/usr/slin/nologin
A tr szűrőt a gyakorlatban két tipikus esetben szoktam használni. A tr 'áéíóöőúüűÁÉÍÓÖŐÚÜŰ' 'aeiooouuuAEIOOOUUU' az ékezettelenítést végzi el egyszerűen, minden magánhangzót az ékezet nélküli megfelelőjére cserél — ideértve a nagybetűket is.
A tr rendelkezik egy -d kapcsolóval is, az ez után megadott karaktereket a szűrő a bemenetből törölni fogja. A cat /etc/passwd | tr -d 'bh' eredményeként a kimenet nem fog b
és h
karaktereket tartalmazni.
7.8. A szűrők kombinálása¶
Szűrőparancsok egymásutánjával egészen bonyolult feladatokat is megoldhatsz. Az alábbi példában megszámoljuk, hány olyan felhasználónk van, akinek a bejelentkezési nevében van kis- vagy nagy a betű!
feri@columbo:~$ cat /etc/passwd | cut -d : -f 1 | grep [aA] | wc -l
112
A megoldás során a felhasználói listából kivágjuk a bejelentkezési neveket, ezt szűrjük az a és a A karakterekre, majd megszámoljuk az így kapott sorokat. A csőben egyik parancs kimenete a másikra kerül, így a következő parancs az előző részfeladatot ellátó szűrő kimenetével dolgozik tovább.
A bonyolultabb feladatok megoldásakor az ismert szűrők képességeiből kell összeállítanod a cső elemeit. A megoldás során érdemes tesztelned, ne írd meg végig a teljes megoldást, hanem a részeredményeket ellenőrizve építkezz – persze ez nem kötelező, de nekem ez a módszer működik leginkább.
7.9. A sed¶
A sed “a szűrők királya”, egy önálló könyvet lehetne írni róla (írtak is.) Ha valamilyen Unix-szal fogsz dolgozni, javaslom, szánj egy őszi délutánt erre a parancsra, és tanuld meg a használatát, egy ütőképes eszközt kapsz ezzel, ami nagyon sok időt takaríthat meg a munkád során.
A sed neve a stream editor szavakból állt elő (a régi szakkönyvek áradatszerkesztőnek fordították) és ugyanúgy, mint a többi szűrő, a bemenetet fogja feldolgozni, és azt a kimenetre írja. Ezért a sed jól használható a csövek készítése során is. A sed paraméterei azonban lényegesen bonyolultabbak, mivel valójában a annak nyelvén kell leírnod, hogy mit is kell tennie. Most csak egy alkalmazását mutatom meg neked, a tr parancsnál már említett szövegrészek keresését és cseréjét:
cat /etc/passwd | sed 's/Balog/Balogh/'
A sed paraméterében levő s
ebben a példában a keresés és csere funkcióját jelenti, a perjeleket követően pedig meg kell adni, hogy mit keresel és a mire akarod cserélni.
Arra, hogy a fájl tartalmát módosítsd, nem lenne jó megoldás, hogy a kimenetet azonnal visszaírod az eredeti fájlba pl. így: cat /etc/passwd | sed 's/Balog/Balog/' >/etc/passwd. A felülírás már akkor megkezdődne, amikor még a forrás olvasása nem fejeződött be, így egy ilyen paranccsal tönkretennéd az eredeti fájlt. A helyes megoldás egy átmeneti fájlba írás, majd egy átnevezés lenne, valahogy így: cat /etc/passwd | sed 's/Balog/Balog/' >/tmp/passwd majd mv /tmp/passwd /etc/passwd.
Mivel ez gyakori feladat, ezért a sed erre kínál önálló megoldást, ehhez a -i kapcsolót kell használnod. Ebben a példában a /tmp/teszt.txt
fájl tartalma egyetlen szó:
root@columbo:/tmp# cat teszt.txt
Balog
Elvégezzük a cserét:
root@columbo:/tmp# sed -i 's/Balog/Balogh/' /tmp/teszt.txt
A csere megtörtént, és annak eredménye vissza is íródott a fájlba:
root@columbo:/tmp# cat teszt.txt
Balogh
7.10. Rendszergazdáknak¶
Minden félévben fel kell vennem kb. száz hallgatót a columbo.uni-eszterhazy.hu gépre. Nem nagy kedvem volna az adataikat rendszeresen gépelgetni, ezért azt csinálom, hogy a Neptunból az egyes kurzusokra jelentkezett hallgatók adatait Excel fájlba exportálom, majd az Excelből egy erre a célra létrehozott, ún. csv
típusú fájlba exportálom. Ezt a jelenlegi használt Excel verzióban a menüjében indítom, majd a fájl típusaként a CSV fájl (UTF formátumban) vesszővel tagolt) (.csv)
értéket választom ki. A csv
fájl csak a táblázat celláiban levő értékeket tartalmazza, minden sort új sorban, az egyes cellák tartalmát vesszővel elválasztva. Ezen kívül semmilyen formázás, képlet nem kerül mentésre. Ezt a fájlt egy egyszerű Windows-os szövegszerkesztővel megnyitva, a teljes tartalmát kijelölve a vágólapra lehet tenni, majd a putty ablakában megnyitott szövegszerkesztőben Shift-Insert megnyomásával be lehet illeszteni. Innentől már nyert ügyem van: a cat és a cut együttesével fel tudom dolgozni a fájlt, és így tömegesen tudom felvenni a felhasználókat a Felhasználó- és csoportkezelés fejezetben részletezett adduser paranccsal.
A cat <file> | szűrő típusú feladatok elvégzésére több parancs esetében van egy egyszerűbb mód is. A legtöbbjük használható úgy is, hogy paraméterként megadod a bemeneti fájlt, elkerülve a cső felépítésének feladatát. Így az alábbi parancsok egyenértékűek:
cat /etc/passwd | wc -l helyett wc -l /etc/passwd
cat /etc/passwd | grep alma helyett grep alma /etc/passwd
cat /etc/passwd | head helyett head /etc/passwd
cat /etc/passwd | tail helyett tail /etc/passwd
és így tovább…
Ezt kihasználva a grep alkalmas lehet arra is, hogy egy könyvtár összes fájljában keresést végezzen. A grep -r Balogh az aktuális könyvtár összes fájlját rekurzívan át fogja nézni, és megjeleníti azokat a sorokat, amelyek a Balogh
szót tartalmazzák.
A tail parancsnak van egy, a rendszergazdai munkában rendkívül hasznos paramétere, a -f. Amennyiben ezt használod, a tail futása nem ér véget, amikor egy fájl utolsó sorait megjeleníti, hanem várni fogja, hogy a fájlba újabb sorok kerüljenek, és azokat is megjeleníti. Hogy mire jó ez? Pl. abban az esetben, amikor valamelyik program a futása közben történt eseményeket egy ún. log fájlba írja, és ezt szeretnéd folyamatosan nyomon követni.
Az én kedvenc levélküldő programom neve Exim, ez a működésével kapcsolatos eseményeket a /var/log/exim4/mainlog
fájlba írja. Ha folyamatosan nyomon szeretném követni a szerveren folyó levélforgalmat, ezt a parancsot használom hozzá, ez minden egyes levél küldésekor meg fogja jeleníteni, hogy a folyamat hogyan zajlott le. (Mivel a columbo-n nem nagyon van levélforgalom, ezt most egy másik gépen mutatom meg.)
root@ns:~# tail -f /var/log/exim4/mainlog
2018-08-15 18:57:53 no host name found for IP address 223.215.187.80
2018-08-15 18:57:54 1fpz7K-0003DY-NE DKIM: d=hblprodukcio-hu.20150623.gappssmtp.com s=20150623 c=relaxed/relaxed a=rsa-sha256 [verification succeeded]
2018-08-15 18:57:54 1fpz7K-0003DV-MC DKIM: d=hblprodukcio-hu.20150623.gappssmtp.com s=20150623 c=relaxed/relaxed a=rsa-sha256 [verification succeeded]
2018-08-15 18:57:55 1fpz7K-0003DV-MC <= hbiro.l@hblprodukcio.hu H=mail-lj1-f179.google.com [209.85.208.179] P=esmtps X=TLS1.2:RSA_AES_128_CBC_SHA1:128 S=24526 id=CALKr4XSY1iautO+vADZLfP6+LehqW0YJtjKxzaj23NuZTi-fuA@mail.gmail.com
2018-08-15 18:57:55 1fpz7K-0003DY-NE <= hbiro.l@hblprodukcio.hu H=mail-lj1-f176.google.com [209.85.208.176] P=esmtps X=TLS1.2:RSA_AES_128_CBC_SHA1:128 S=24530 id=CALKr4XSY1iautO+vADZLfP6+LehqW0YJtjKxzaj23NuZTi-fuA@mail.gmail.com
2018-08-15 18:57:55 login authenticator failed for (eosdlyziv.com) [223.215.187.80]: 535 Incorrect authentication data (set_id=info@egertiszk.hu)
2018-08-15 18:57:55 1fpz7K-0003DY-NE => gonczi.peter@marshallablak.hu R=marshall_route T=remote_smtp H=marshall.koczka.hu [81.183.222.223] C="250 OK id=1fpz7L-0004rO-6r"
2018-08-15 18:57:55 1fpz7K-0003DY-NE Completed
2018-08-15 18:57:55 1fpz7K-0003DV-MC => pal.laszlo@marshallablak.hu R=marshall_route T=remote_smtp H=marshall.koczka.hu [81.183.222.223] C="250 OK id=1fpz7L-0004rP-7h"
2018-08-15 18:57:55 1fpz7K-0003DV-MC Completed
A sort esetében érdemes megtanulnod néhány egyéb paramétert is. Gyakran használom a -h kapcsolót, amely hatására a sort képes értelmezni a K, M, G, T prefixeket, és megfelelően rendezni a 10M, 6T, 3K, 4G méreteket is. Ennek nagy hasznát veszem akkor, amikor pl. könyvtárakat akarok nagyság szerint sorba rendezni: a du -schL * | sort -h ezeket jól olvasható méretekkel, növekvő sorrendben jeleníti meg. Van paramétere a hónapok neveinek rendezésére is, ez a -M.
7.11. Ellenőrző kérdések¶
Mi a szűrők feladata?
Hogyan működik a szűrési mechanizmus?
Milyen szűrők használhatók, és mi a feladatuk?
Hogyan lehet a szűrők kimenetét fájlba irányítani?
Milyen szabályokat emelne ki a uniq használata esetén?
Hogyan lehet kombinálni a szűrőket?
Hogyan lehet egyéni szűrőt készíteni?
Mi a sed?
7.12. Feladatok¶
Jelenítsd meg az
/etc/passwd
tartalmát oldalakra bontva! Hogyan lehet a következő oldalara lapozni, az előző oldalra ugrani, soronként fel- illetve továbblépni, szövegrészt keresni, illetve kilépni a pagerből?Az
/etc/passwd
fájlból jelenítsd meg azokat a sorokat, amelyek tartalmazzák az sh karakterláncot!Az
/etc/passwd
fájlból jelenítsd meg azokat a sorokat, amelyek nem tartalmazzák az sh karakterláncot!Az
/etc/passwd
fájlból jelenítsd meg azokat a sorokat, amelyek r betűvel kezdődnek!Az
/etc/passwd
fájlból jelenítsd meg azokat a sorokat, amelyek false-ra végződnek!Az
/etc/passwd
fájlból jelenítsd meg azokat a sorokat, akiknek a login neve f-fel kezdődik!Az
/etc/passwd
fájlból jelenítsd meg azokat a felhasználó neveket, akiknek a login nevében szerepel a tom szó!Az
/etc/passwd
fájlból jelenítsd meg azokat a sorokat, amelyben a login név pontosan root!Hány olyan felhasználó van a rendszerben, akinek a login neve magánhangzóval kezdődik? (Figyelj a kis- és nagybetűkre!)
Hány olyan felhasználó van a rendszerben, akinek a shellje nem
/bin/bash
?Hány blokkos eszközfájl van a /dev könyvtárban? Hány karakteres eszközfájl van ugyanebben a könyvtárban?
Jelenítsd meg az
/etc/bash.bashrc
fájl azon nem üres sorait, amelyek nem megjegyzések (azaz nem # karakterrel kezdődnek)!Az előző feladatot oldd meg úgy, hogy a parancs ezeket a sorokat a home könyvtáradba, egy
bash.txt
nevű fájlba írja ki!Hány olyan könyvtár van a
/etc
könyvtárban, melynek csoportjogai: r-x?Jelenítsd meg a root felhasználó aktuális havi bejelentkezéseinek történetét!
Be van most jelentkezve a rendszergazda? Ha igen, mit futtat most?
Hány különféle shell létezik az
/etc/passwd
fájlban?Írasd ki a bejelentkezettek listáját! Gondoskodj arról, hogy ha valaki több példányban jelentkezett be, akkor is csak egyszer jelenjen meg a neve!
Kik azok a felhasználók, akik ebben a hónapban bejelentkeztek a szerverre? És ha a reboot felhasználó nem érdekel bennünket?
Írasd ki a felhasználók neveit ábécé sorrendben!
A
/etc/passwd
file-ban hány sor kezdődik f-fel?Jelenítsd meg a
/etc/passwd
első három sorát!Jelenítsd meg a
/etc/passwd
utolsó hét sorát!Jelenítsd meg a felhasználók névsorából az első, majd az utolsó 12 nevet! Meg tudod oldani ezt egy sor begépelésével is?
Melyik felhasználó jelentkezett be először ebbe a hónapban?
Hány sora van a
/etc/passwd
file-nak?Hány karakter van ugyenezen file utolsó 8 sorában?
Hány karakter van az
/etc
könyvtár tartalomjegyzékében?Hány alkalommal jelentkezett be a root felhasználó ebben a hónapban?
Jelenítsd meg a
/etc/passwd
tartalmát rendezve!Jelenítsd meg visszafelé rendezve a
/etc/passwd
fájlból kinyert UID-eket!Melyik a legnagyobb UID a
/etc/passwd
fájlban?Jelenítsd meg az ábécébe rendezett
/etc/passwd
file tartalmának első 15 sorát!Hány sorból és karakterből áll az előző parancs kimenete?
Írasd ki a felhasználók nevét úgy, hogy minden ékezetes karaktert cserélj ékezet nélkülire, a szóköz karaktert pedig helyettesítsd _ karakterrel!
A felhasználók listájában töröld az összes j karaktert!
Írasd ki a
/etc/passwd
tartalmát visszafelé!
Ha szereted a kihívásokat, próbáld megoldani ezeket:
Írd ki az Euro hivatalos deviza árfolyamát, melyet a
http://www.mnb.hu
oldalon lehet megtekinteni!Gyűjtsd ki az e-mail címeket a
http://www.jgytf.u-szeged.hu/tanszek/alkegeszseg/01_IntezetMenu/04Munkatarsak/munkatarsak.html
oldalról! A példa mutatja, hogy miért nem szabad az e-mail címeket egyszerű formában weboldalon elérhetővé tenni: a spammerek ezeket könnyen begyűjthetik.