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

6.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>@ formájú 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 így is elég bonyolult példa lett.

A grep alég sok egyéb képességgel rendelkezik, érdemes átfutnod a leírását a mag grep paranccsal.

Tip

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.

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

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

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

6.5. A sort

A bemenet sorinak 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

Tip

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.

6.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éertelmező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

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.

6.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űeket Balogh-ra. A parancsnak a felntiek é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 ‘áéíóöőúüűÁÉÍÓÖŐÚÜŰ’ ‘aeiooouuuAEIOOOÚÚÚ’ 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.

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

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

6.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 Fájl ‣ Mentés másképp 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.