103.2 Lecke 1
Tanúsítvány: |
LPIC-1 |
---|---|
Verzió: |
5.0 |
Témakör: |
103 GNU és Unix parancsok |
Fejezet: |
103.2 Szövegfolyamok feldolgozása szűrőkkel |
Lecke: |
1/1 |
Bevezetés
A szöveggel való foglalkozás minden rendszergazda munkájának fontos részét képezi. Doug McIlroy, az eredeti Unix fejlesztőcsapatának egyik tagja foglalta össze a Unix filozófiáját, és azt mondta (más fontos dolgok mellett): “Írj programokat a szövegfolyam kezelésére, mert az egy univerzális interfész.” A Linuxot a Unix operációs rendszer ihlette, és határozottan átveszi annak filozófiáját, így egy rendszergazdának sok szövegkezelő eszközre kell számítania egy Linux-disztribúción belül.
Az átirányítások és a csővezetékek gyors áttekintése
Szintén a Unix filozófiájából:
-
Írjunk olyan programokat, amelyek egy dolgot csinálnak, és azt jól csinálják.
-
Írjunk olyan programokat, amelyek együtt dolgoznak.
A programok együttműködésének egyik fő módja a csővezetékezés (piping) és az átirányítások (redirections). Szinte minden szövegmanipuláló programunk szöveget kap egy szabványos bemenetről (stdin), majd kiadja azt egy szabványos kimenetre (stdout), és az esetleges hibákat egy szabványos hibakimenetre (stderr) küldi. Hacsak nem adunk meg mást, a szabványos bemenet az lesz, amit a billentyűzeten beírunk (a program az Enter billentyű lenyomása után olvassa be). Hasonlóképpen, a standard kimenet és a hibák a terminál képernyőjén fognak megjelenni. Lássuk, hogyan működik ez!
A terminálba írjuk be a cat
parancsot, majd nyomjuk meg az Enter billentyűt! Ezután írjunk be valami véletlenszerű szöveget!
$ cat Ez egy teszt Ez egy teszt Hey! Hey! Mindent megismétel, amit beírok! Mindent megismétel, amit beírok! (Meg fogom nyomni a ctrl+c-t és megállítom ezt a nonszensz viselkedést) (Meg fogom nyomni a ctrl+c-t és megállítom ezt a nonszensz viselkedést) ^C
A cat
parancsról (a kifejezés a concatenate
szóból származik) további információkat a man oldalakon találhatunk.
Note
|
Ha egy nagyon egyszerű Linux szerver telepítésén dolgozunk, akkor néhány parancs, mint például az |
Mint fentebb bemutattuk, ha nem adjuk meg, hogy a cat
honnan olvasson, akkor a standard bemenetről fog olvasni (bármit is írunk be), és amit olvas, azt a terminál ablakba (a standard kimenetre) adja ki.
Próbáljuk ki a következőt:
$ cat > mytextfile Ez egy teszt Remélem, hogy a cat eltárolja ezt a mytextfile-ba, mivel átirányítottam a kimenetet Megnyomom a ctrl+c-t és ellenőrzöm ^C $ cat mytextfile Ez egy teszt Remélem, hogy a cat eltárolja ezt a mytextfile-ba, mivel átirányítottam a kimenetet Megnyomom a ctrl+c-t és ellenőrzöm
A >
(nagyobb, mint) azt mondja a cat
-nek, hogy a kimenetét a mytextfile
fájlba irányítsa, ne pedig a standard kimenetre. Most próbáljuk ki ezt:
$ cat mytextfile > mynewtextfile $ cat mynewtextfile Ez egy teszt Remélem, hogy a cat eltárolja ezt a mytextfile-ba, mivel átirányítottam a kimenetet Megnyomom a ctrl+c-t és ellenőrzöm
Ennek hatására a mytextfile
másolódik az mynewtextfile
-ba. A diff
végrehajtásával ellenőrizhetjük, hogy a két fájl tartalma megegyezik-e:
$ diff mynewtextfile mytextfile
Mivel nincs kimenet, a fájlok megegyeznek. Most próbáljuk ki az append átirányítási operátort (>>
):
$ echo 'Ez az új sor' >> mynewtextfile $ diff mynewtextfile mytextfile 4d3 < Ez az új sor
Eddig átirányításokat használtunk fájlok létrehozására és manipulálására. A csöveket (pipes) (a |
szimbólummal ábrázolva) arra is használhatjuk, hogy egy program kimenetét átirányítsuk egy másik programba. Keressük meg azokat a sorokat, ahol az “ez” szó található:
$ cat mytextfile | grep this Remélem, hogy a cat eltárolja ezt a mytextfile-ba, mivel átirányítottam a kimenetet Megnyomom a ctrl+c-t és ellenőrzöm $ cat mytextfile | grep -i this Ez egy teszt Remélem, hogy a cat eltárolja ezt a mytextfile-ba, mivel átirányítottam a kimenetet Megnyomom a ctrl+c-t és ellenőrzöm
Most a cat
kimenetét átirányítottuk egy másik parancsba: A grep
parancsot egy másik parancsra küldtük: grep
. Figyeljük meg, hogy ha figyelmen kívül hagyjuk az esetet (a -i
opciót használva), akkor egy extra sort kapunk eredményként.
Szövegfolyamok feldolgozása
Tömörített fájl olvasása
Létrehozunk egy ftu.txt
nevű fájlt, amely a következő parancsok listáját tartalmazza:
bzcat cat cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc xzcat zcat
Most a grep
paranccsal kiírjuk az összes olyan sort, amely tartalmazza a cat
karakterláncot:
$ cat ftu.txt | grep cat bzcat cat xzcat zcat
Egy másik módja ennek az információnak az, hogy a grep
parancsot használjuk a szöveg közvetlen szűrésére, anélkül, hogy egy másik alkalmazást kellene használni a szövegfolyam elküldésére az stdout
-ba.
$ grep cat ftu.txt bzcat cat xzcat zcat
Note
|
Ne feledjük, hogy ugyanazt a feladatot többféleképpen is el lehet végezni Linux alatt! |
Vannak más parancsok is, amelyek tömörített fájlokat kezelnek (bzcat
a bzip
tömörített fájlokra, xzcat
az xz
tömörített fájlokra és zcat
a gzip
tömörített fájlokra), és mindegyik az adott tömörített fájl tartalmának megtekintésére szolgál az alkalmazott tömörítési algoritmus alapján.
Ellenőrizzük, hogy az újonnan létrehozott ftu.txt
fájl az egyetlen a mappában, majd hozzuk létre a fájl gzip
tömörített változatát:
$ ls ftu* ftu.txt $ gzip ftu.txt $ ls ftu* ftu.txt.gz
Ezután használjuk a zcat
parancsot a gzippelt tömörített fájl tartalmának megtekintéséhez:
$ zcat ftu.txt.gz bzcat cat cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc xzcat zcat
Vegyük figyelembe, hogy a gzip
az ftu.txt
fájlt ftu.txt.gz
-be tömöríti, és eltávolítja az eredeti fájlt. Alapértelmezés szerint a gzip
parancs kimenete nem jelenik meg. Ha azonban szeretnénk, hogy a gzip
kiírja, hogy mit csinál, használjuk a -v
opciót a “verbose” kimenethez.
Fájl megtekintése lapozóban
Tudjuk, hogy a cat
egy fájlt kapcsol össze a szabványos kimenettel (ha a parancs után megadjuk a fájlt). A /var/log/syslog
fájlban tárol a Linux minden fontos eseményt, ami a rendszerben történik. A sudo
parancs használatával bővíthetjük a jogosultságokat, hogy be tudjuk olvasni a /var/log/syslog
fájlt:
$ sudo cat /var/log/syslog
…látni fogjuk, hogy az üzenetek nagyon gyorsan gördülnek a terminálablakban. A kimenetet a less
programba továbbíthatjuk, így az eredmények oldalszámozva lesznek. A less
használatával a nyílbillentyűkkel navigálhatunk a kimeneten, és a vi
parancsaihoz hasonló parancsokat is használhatunk a szövegben való navigálásra és keresésre.
Ahelyett azonban, hogy a cat
parancsot átvezetnénk (csővezetékkel) egy lapozó programba, hasznosabb, ha közvetlenül a lapozási programot használjuk:
$ sudo less /var/log/syslog ... (kimenet az átláthatóság kedvéért kihagyva)
Szövegfájl egy részének megszerzése
Ha csak a fájl elejét vagy végét kell áttekinteni, más módszerek is rendelkezésre állnak. A head
paranccsal alapértelmezés szerint a fájl első tíz sorát, a tail
parancs pedig alapértelmezés szerint a fájl utolsó tíz sorát olvassa be. Most próbáljuk ki:
$ sudo head /var/log/syslog Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded. Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files. Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low) Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T' Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device! Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high) $ sudo tail /var/log/syslog Nov 13 10:24:45 hypatia kernel: [ 8001.679238] mce: CPU7: Core temperature/speed normal Nov 13 10:24:46 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Activating via systemd: service name='org.freedesktop.Tracker1.Miner.Extract' unit='tracker-extract.service' requested by ':1.73' (uid=1000 pid=2425 comm="/usr/lib/tracker/tracker-miner-fs ") Nov 13 10:24:46 hypatia systemd[2004]: Starting Tracker metadata extractor... Nov 13 10:24:47 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Successfully activated service 'org.freedesktop.Tracker1.Miner.Extract' Nov 13 10:24:47 hypatia systemd[2004]: Started Tracker metadata extractor. Nov 13 10:24:54 hypatia kernel: [ 8010.462227] mce: CPU0: Core temperature above threshold, cpu clock throttled (total events = 502907) Nov 13 10:24:54 hypatia kernel: [ 8010.462228] mce: CPU4: Core temperature above threshold, cpu clock throttled (total events = 502911) Nov 13 10:24:54 hypatia kernel: [ 8010.469221] mce: CPU0: Core temperature/speed normal Nov 13 10:24:54 hypatia kernel: [ 8010.469222] mce: CPU4: Core temperature/speed normal Nov 13 10:25:03 hypatia systemd[2004]: tracker-extract.service: Succeeded.
A megjelenített sorok számának szemléltetésére a head
parancs kimenetét átvezethetjük az nl
parancsba, amely megjeleníti a parancsba áramló szöveg sorainak számát:
$ sudo head /var/log/syslog | nl 1 Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed 2 Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded. 3 Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files. 4 Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low) 5 Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC' 6 Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C' 7 Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S' 8 Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T' 9 Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device! 10 Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high)
Ugyanezt megtehetjük úgy is, hogy a tail
parancs kimenetét a wc
parancsnak adjuk át, amely alapértelmezés szerint a dokumentumban lévő szavak számát számolja, és az -l
kapcsolóval kiírjuk a parancs által olvasott szövegsorok számát:
$ sudo tail /var/log/syslog | wc -l 10
Ha a rendszergazdának több (vagy kevesebb) fájl elejét vagy végét kell átnéznie, az -n
kapcsolóval korlátozhatja a parancsok kimenetét:
$ sudo tail -n 5 /var/log/syslog Nov 13 10:37:24 hypatia systemd[2004]: tracker-extract.service: Succeeded. Nov 13 10:37:42 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Activating via systemd: service name='org.freedesktop.Tracker1.Miner.Extract' unit='tracker-extract.service' requested by ':1.73' (uid=1000 pid=2425 comm="/usr/lib/tracker/tracker-miner-fs ") Nov 13 10:37:42 hypatia systemd[2004]: Starting Tracker metadata extractor... Nov 13 10:37:43 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Successfully activated service 'org.freedesktop.Tracker1.Miner.Extract' Nov 13 10:37:43 hypatia systemd[2004]: Started Tracker metadata extractor. $ sudo head -n 12 /var/log/syslog Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded. Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files. Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low) Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T' Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device! Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high) Nov 12 08:04:30 hypatia vdr: [882] no DVB device found Nov 12 08:04:30 hypatia vdr: [882] initializing plugin: vnsiserver (1.8.0): VDR-Network-Streaming-Interface (VNSI) Server
A sed, a Stream Editor alapjai
Nézzük meg a többi fájlt, kifejezést és segédprogramot, amelyek nevében nem szerepel a cat
. Ezt úgy tehetjük meg, hogy a grep
-nek átadjuk a -v
kapcsolót, ami arra utasítja a parancsot, hogy csak a cat
-t nem tartalmazó sorokat adja ki:
$ zcat ftu.txt.gz | grep -v cat cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc
A legtöbbet, amit a grep
-pel megtehetünk, a sed
-del is meg lehet — a szöveg szűrésére és átalakítására szolgáló szerkesztővel (ahogyan azt a sed
kézikönyv oldal is írja). Először helyreállítjuk az ftu.txt
fájlunkat a fájl gzip
archívumának kicsomagolásával:
$ gunzip ftu.txt.gz $ ls ftu* ftu.txt
Most már használhatjuk a sed
-t, hogy csak a cat
karakterláncot tartalmazó sorokat listázzuk ki:
$ sed -n /cat/p < ftu.txt bzcat cat xzcat zcat
A <<
jelet arra használtuk, hogy az ftu.txt
fájl tartalmát a sed
parancsunkba irányítsuk. A kötőjelek közé zárt szó (pl. /cat/
) az a kifejezés, amelyet keresünk. A -n
opció arra utasítja a sed
parancsot, hogy ne adjon ki semmilyen kimenetet (kivéve a későbbiekben a p
parancs által utasítottakat). Próbáljuk meg ugyanezt a parancsot az -n
opció nélkül futtatni, hogy lássuk, mi történik. Ezután pedig próbáljuk ki ezt:
$ sed /cat/d < ftu.txt cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc
Ha nem használjuk az -n
opciót, akkor a sed
mindent kiír a fájlból, kivéve azt, amit a d
utasít a sed
-nek, hogy törölje a kimenetből.
A sed
-et gyakran használják a fájlon belüli szöveg keresésére és cseréjére. Tegyük fel, hogy a cat
minden előfordulását dog
-ra akarjuk cserélni. Erre a sed
-et használhatjuk az s
opció megadásával, hogy az első kifejezés, a cat
minden egyes példányát kicseréljük a második kifejezésre, a dog
-ra:
$ sed s/cat/dog/ < ftu.txt bzdog dog cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc xzdog zdog
Ahelyett, hogy átirányító operátorral (<
) adnánk át az ftu.txt
fájlt a sed
parancsnak, a sed
közvetlenül a fájlon is dolgozhat. Ezt próbáljuk ki a következőkben, miközben egyidejűleg biztonsági másolatot készítünk az eredeti fájlról:
$ sed -i.backup s/cat/dog/ ftu.txt $ ls ftu* ftu.txt ftu.txt.backup
Az -i
opció egy helybeni sed
műveletet hajt végre az eredeti fájlon. Ha az -i
paraméter után nem használjuk a .backup
-ot, akkor csak átírnánk az eredeti fájlunkat. Bármit is használunk szövegként az -i
paraméter után, az lesz az a név, amire az eredeti fájl el lesz mentve a sed
által kért módosítások előtt.
Az adatok integritásának biztosítása
Bemutattuk, hogy milyen egyszerű a fájlok kezelése Linuxon. Előfordulhat, hogy egy fájlt másnak szeretnénk továbbítani, és biztosak akarunk lenni abban, hogy a címzett az eredeti fájl valódi másolatát kapja meg. Ennek a technikának egy nagyon gyakori felhasználási módja, amikor a Linux disztribúciós szerverek letölthető CD- vagy DVD-image-ket tárolnak a szoftverükről, olyan fájlokkal együtt, amelyek tartalmazzák a lemez image-k kiszámított checksum értékeit. Íme egy példa egy Debian letöltési tárhelyről:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [PARENTDIR] Parent Directory - [SUM] MD5SUMS 2019-09-08 17:46 274 [CRT] MD5SUMS.sign 2019-09-08 17:52 833 [SUM] SHA1SUMS 2019-09-08 17:46 306 [CRT] SHA1SUMS.sign 2019-09-08 17:52 833 [SUM] SHA256SUMS 2019-09-08 17:46 402 [CRT] SHA256SUMS.sign 2019-09-08 17:52 833 [SUM] SHA512SUMS 2019-09-08 17:46 658 [CRT] SHA512SUMS.sign 2019-09-08 17:52 833 [ISO] debian-10.1.0-amd64-netinst.iso 2019-09-08 04:37 335M [ISO] debian-10.1.0-amd64-xfce-CD-1.iso 2019-09-08 04:38 641M [ISO] debian-edu-10.1.0-amd64-netinst.iso 2019-09-08 04:38 405M [ISO] debian-mac-10.1.0-amd64-netinst.iso 2019-09-08 04:38 334M ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
A fenti felsorolásban a Debian telepítő képfájlokat szöveges fájlok kísérik, amelyek a fájlok különböző algoritmusok (MD5, SHA1, SHA256 és SHA512) szerinti checksumait tartalmazzák.
Note
|
A checksum egy fájl ellenében egy kriptográfiai hash-függvényen alapuló matematikai számításból származó érték. A kriptográfiai hash-funkcióknak különböző típusai vannak, amelyek erőssége eltérő. A vizsgán elvárják, hogy ismerjük az |
Miután letöltöttünk egy fájlt (például a debian-10.1.0-amd64-netinst.iso
imaget), összehasonlíthatjuk a letöltött fájl checksumát a megadott checksummal.
Íme egy példa a lényeg illusztrálására. Az ftu.txt
fájl SHA256 értékét a sha256sum
paranccsal fogjuk kiszámítani:
$ sha256sum ftu.txt 345452304fc26999a715652543c352e5fc7ee0c1b9deac6f57542ec91daf261c ftu.txt
A fájl neve előtt álló hosszú karaktersorozat a szöveges fájl SHA256 checksum értéke. Hozzunk létre egy olyan fájlt, amely tartalmazza ezt az értéket, hogy az eredeti szöveges fájlunk integritásának ellenőrzésére használhassuk. Ezt megtehetjük ugyanezzel az sha256sum
paranccsal, és a kimenetet átirányíthatjuk egy fájlba:
$ sha256sum ftu.txt > sha256.txt
Most az ftu.txt
fájl ellenőrzéséhez ugyanezt a parancsot használjuk, és megadjuk a checksum értékét tartalmazó fájlnevet a -c
kapcsolóval együtt:
$ sha256sum -c sha256.txt ftu.txt: OK
A fájlban található érték megegyezik az ftu.txt
fájlunk kiszámított SHA256 ellenőrző összegével, ahogyan azt elvárnánk. Ha azonban az eredeti fájl módosulna (például néhány bájt elveszne egy fájl letöltése során, vagy valaki szándékosan manipulálta volna), az értékellenőrzés sikertelen lenne. Ilyen esetekben tudjuk, hogy a fájlunk rossz vagy sérült, és nem bízhatunk a tartalmának integritásában. Hogy bizonyítsuk a dolgot, a fájl végére egy kis szöveget illesztünk:
$ echo "new entry" >> ftu.txt
Most megpróbáljuk ellenőrizni a fájl sértetlenségét:
$ sha256sum -c sha256.txt ftu.txt: FAILED sha256sum: WARNING: 1 computed checksum did NOT match
És látjuk, hogy a checksum nem egyezik a fájl elvárt értékével. Ezért nem bízhatunk a fájl integritásában. Megkísérelhetjük letölteni a fájl új példányát, jelenthetjük a checksum hibáját a fájl feladójának, vagy jelenthetjük az adatközpont biztonsági csapatának, a fájl fontosságától függően.
A fájlok mélyebb vizsgálata
Az octal dump (od
) parancsot gyakran használják alkalmazások és különböző fájlok hibakeresésére. Önmagában az od
parancs csak felsorolja egy fájl tartalmát oktális formátumban. A korábbi ftu.txt
fájlunkat használhatjuk, hogy gyakoroljunk ezzel a paranccsal:
$ od ftu.txt 0000000 075142 060543 005164 060543 005164 072543 005164 062550 0000020 062141 066012 071545 005163 062155 071465 066565 067012 0000040 005154 062157 070012 071541 062564 071412 062145 071412 0000060 060550 032462 071466 066565 071412 060550 030465 071462 0000100 066565 071412 071157 005164 070163 064554 005164 060564 0000120 066151 072012 005162 067165 070551 073412 005143 075170 0000140 060543 005164 061572 072141 000012 0000151
A kimenet első oszlopa a byte offset a kimenet minden egyes sorához. Mivel az od
alapértelmezés szerint oktális formátumban írja ki az információt, minden sor a nyolc bites bájteltolódással kezdődik, amelyet nyolc oszlop követ, amelyek mindegyike az adott oszlopon belüli adatok oktális értékét tartalmazza.
Tip
|
Emlékezzünk arra, hogy egy bájt 8 bit hosszúságú! |
Ha egy fájl tartalmát hexadecimális formátumban szeretnénk megtekinteni, használjuk az -x
kapcsolót:
$ od -x ftu.txt 0000000 7a62 6163 0a74 6163 0a74 7563 0a74 6568 0000020 6461 6c0a 7365 0a73 646d 7335 6d75 6e0a 0000040 0a6c 646f 700a 7361 6574 730a 6465 730a 0000060 6168 3532 7336 6d75 730a 6168 3135 7332 0000100 6d75 730a 726f 0a74 7073 696c 0a74 6174 0000120 6c69 740a 0a72 6e75 7169 770a 0a63 7a78 0000140 6163 0a74 637a 7461 000a 0000151
Most a bájteltolást követő nyolc oszlop mindegyikét a hexadecimális megfelelőjükkel ábrázoljuk.
Az od
parancs egyik praktikus felhasználási módja a szkriptek hibakeresése. Az od
parancs például megmutathatja a fájlban létező, általában nem látható karaktereket, például a newline bejegyzéseket. Ezt a -c
opcióval tehetjük meg, így az egyes bájtok numerikus jelölése helyett ezek az oszlopbejegyzések karakteres megfelelőiként jelennek meg:
$ od -c ftu.txt 0000000 b z c a t \n c a t \n c u t \n h e 0000020 a d \n l e s s \n m d 5 s u m \n n 0000040 l \n o d \n p a s t e \n s e d \n s 0000060 h a 2 5 6 s u m \n s h a 5 1 2 s 0000100 u m \n s o r t \n s p l i t \n t a 0000120 i l \n t r \n u n i q \n w c \n x z 0000140 c a t \n z c a t \n 0000151
A fájlon belüli összes újsoros bejegyzést a rejtett \n
karakterek jelölik. Ha csak az összes karaktert szeretnénk megtekinteni a fájlban, és nem kell látnunk a bájteltolódási információt, a bájtolódás oszlopot a következőképpen távolíthatjuk el a kimenetből:
$ od -An -c ftu.txt b z c a t \n c a t \n c u t \n h e a d \n l e s s \n m d 5 s u m \n n l \n o d \n p a s t e \n s e d \n s h a 2 5 6 s u m \n s h a 5 1 2 s u m \n s o r t \n s p l i t \n t a i l \n t r \n u n i q \n w c \n x z c a t \n z c a t \n
Gyakorló feladatok
-
Valaki most adományozott egy laptopot az iskolánknak, és most szeretnénk Linuxot telepíteni rá. Nincs kézikönyv és kénytelenek vagyunk egy USB pendrive-ról bootolni, ahol nincs semmilyen grafika. Kapunk egy shell terminált, és tudjuk, hogy minden processzornak lesz egy sora a
/proc/cpuinfo
fájlban:processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 158 (kihagyott sorok) processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 158 (még több kihagyott sor)
-
A
grep
éswc
parancsok segítségével jelenítsük meg, hogy hány processzorral rendelkezünk! -
Tegyük meg ugyanezt a
sed
használatával agrep
helyett!
-
-
Vizsgáljuk meg a helyi
/etc/passwd
fájlt agrep
,sed
,head
éstail
parancsokkal az alábbi feladatok szerint:-
Mely felhasználóknak van hozzáférése a Bash shellhez?
-
A rendszerünkben különböző felhasználók vannak, akik bizonyos programok kezelésére vagy adminisztrációs céllal léteznek. Nekik nincs hozzáférésük a shellhez. Hány ilyen felhasználó létezik a rendszerben?
-
Hány felhasználó és csoport létezik a rendszerben (ne feledjük: csak az
/etc/passwd
fájlt használjuk)? -
Csak az
/etc/passwd
fájl első, utolsó és tizedik sorát listázzuk ki!
-
-
Vegyük például az alábbi
/etc/passwd
fájlt. Másoljuk az alábbi sorokat egymypasswd
nevű helyi fájlba a gyakorláshoz!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 nvidia-persistenced:x:121:128:NVIDIA Persistence Daemon,,,:/nonexistent:/sbin/nologin libvirt-qemu:x:64055:130:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:122:133:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash dave:x:1001:1000:Dave Edwards,Finance,,,Main Office:/home/dave:/bin/ksh emma:x:1002:1000:Emma Jones,Finance,,,Main Office:/home/emma:/bin/bash frank:x:1003:1000:Frank Cassidy,Finance,,,Main Office:/home/frank:/bin/bash grace:x:1004:1000:Grace Kearns,Engineering,,,Main Office:/home/grace:/bin/ksh henry:x:1005:1000:Henry Adams,Sales,,,Main Office:/home/henry:/bin/bash john:x:1006:1000:John Chapel,Sales,,,Main Office:/home/john:/bin/bash
-
Listázzuk ki az összes felhasználót az
1000
csoportból (használjuk ased
-et a megfelelő mezőt kiválasztásához) amypasswd
fájlból! -
Listázzuk ki csak a felhasználók teljes nevét ebből a csoportból (a
sed
éscut
használatával)!
-
Gondolkodtató feladatok
-
Ismét az előző feladatokban használt
mypasswd
fájl segítségével találjunk ki egy Bash-parancsot, amely kiválaszt egy személyt a Main Office-ból (Fő Irodából), aki megnyeri a tombolaversenyt. Ased
paranccsal csak a Main Office sorait listázzuk ki, majd egycut
parancssorozattal nyerjük ki az egyes felhasználók keresztnevét ezekből a sorokból. Ezután ezeket a neveket rendezzük véletlenszerűen, és a listából csak a legfelső nevet írassuk ki! -
Hányan dolgoznak a Finance (pénzügyi), a Engineering (mérnöki) és az Sales (értékesítési) területeken? (Fontoljuk meg a
uniq
parancs használatát!) -
Most egy CSV (comma separeted values - vesszővel elválasztott értékek) fájlt kell készítenünk, hogy az előző példában szereplő
mypasswd
fájlból könnyen importálhassuk anames.csv
fájlt a LibreOffice-ba. A fájl tartalma a következő formátumú lesz:First Name,Last Name,Position Carol,Smith,Finance ... John,Chapel,Sales
Tipp: Használjuk a
sed
,cut
, éspaste
parancsokat az elvárt eredmények eléréséhez! Vegyük figyelembe, hogy a vessző (,
) lesz a delimiter (elválasztó) ennél a fájlnál! -
Tegyük fel, hogy az előző feladatban létrehozott
names.csv
táblázat egy fontos fájl, és szeretnénk biztosítani, hogy senki ne piszkálhassa attól a pillanattól kezdve, hogy elküldjük valakinek, és attól a pillanattól kezdve, hogy a címzett megkapja. Hogyan biztosíthatjuk ennek a fájlnak az integritását azmd5sum
segítségével? -
Eldöntöttük, hogy naponta 100 sort olvasunk egy klasszikus könyvből, és úgy döntöttünk, hogy Herman Melville Mariner and Mystic című művével kezdjük. Találjunk ki egy olyan parancsot a
split
segítségével, amely ezt a könyvet 100 soros szakaszokra osztja. Ahhoz, hogy a könyvet egyszerű szöveges formátumban megkapjuk, keressük azt meg a https://www.gutenberg.org címen. -
Az
ls -l
használatával a/etc
mappában milyen listát kapunk? Acut
parancsot használva az adottls
parancs kimenetén hogyan jeleníthetnénk meg csak a fájlneveket? Mi a helyzet a fájlnevekkel és a fájlok tulajdonosával? Azls -l
és acut
parancsok mellett használjuk atr
parancsot a szóköz többszörös előfordulásának egyetlen szóközzé való összenyomására (squeeze), hogy segítsük a kimenet formázását acut
paranccsal! -
Ez a gyakorlat azt feltételezi, hogy egy valódi gépet (nem virtuális gépet) használunk. Egy USB-pendrive is legyen nálunk. Nézzük át a
tail
parancs kézikönyvének oldalait, és találjuk meg, hogyan követhetünk egy fájlt, amihez szöveg hozzá van csatolva. Miközben atail
parancs kimenetét figyeljük a/var/log/syslog
fájlban, helyezzünk be egy USB-pendrive-ot. Írjuk ki a teljes parancsot, amellyel az USB-stick terméknevét, gyártóját és teljes memóriamennyiségét szeretnénk megtudni!
Összefoglalás
A szövegfolyamok kezelése nagy jelentőséggel bír bármely Linux rendszer adminisztrálásakor. A szövegfolyamokat szkriptek segítségével lehet feldolgozni a napi feladatok automatizálása vagy a naplófájlokban található releváns hibakeresési információk megtalálása érdekében. Az alábbiakban röviden összefoglaljuk a leckében tárgyalt parancsokat:
cat
-
Sima szöveges fájlok kombinálására vagy olvasására szolgál.
bzcat
-
Lehetővé teszi a
bzip2
módszerrel tömörített fájlok feldolgozását vagy olvasását. xzcat
-
Lehetővé teszi az
xz
módszerrel tömörített fájlok feldolgozását vagy olvasását. zcat
-
Lehetővé teszi a
gzip
módszerrel tömörített fájlok feldolgozását vagy olvasását. less
-
Ez a parancs lapozhatóvá teszi a fájl tartalmát, és lehetővé teszi a navigációt és a keresést.
head
-
Ez a parancs alapértelmezés szerint a fájl első 10 sorát jeleníti meg. Az
-n
kapcsoló használatával kevesebb vagy több sor is megjeleníthető. tail
-
Ez a parancs alapértelmezés szerint a fájl utolsó 10 sorát jeleníti meg. Az
-n
kapcsoló használatával kevesebb vagy több sor is megjeleníthető. Az-f
kapcsoló arra szolgál, hogy kövessük a szöveges fájl kimenetét, amikor új adatok íródnak bele. wc
-
A “word count” rövidítése, de a használt paraméterektől függően karaktereket, szavakat és sorokat is meg tud számolni.
sort
-
A kimenetet ábécé, fordított ábécé vagy véletlenszerű sorrendbe rendezi.
uniq
-
Az egyező sztringek listázásra (és számolására) szolgál.
od
-
Az “octal dump” parancs egy bináris fájl megjelenítésére szolgál oktális, decimális vagy hexadecimális jelöléssel.
nl
-
A “number line” parancs megjeleníti a fájlban lévő sorok számát, valamint újra létrehozza a fájlt úgy, hogy minden egyes sor elé a odaírja a sorszámát.
sed
-
A stream editor (folyamszerkesztő) használható sztringek előfordulásának keresésére reguláris kifejezések segítségével, valamint fájlok szerkesztésére előre definiált minták alapján.
tr
-
A translate parancs képes karaktereket cserélni, valamint eltávolítja és tömöríti az ismétlődő karaktereket.
cut
-
Ez a parancs ki tudja írni a szövegfájlok oszlopait mezőként a fájl karakteres elválasztójelén (delimiter) alapuló mezőként.
paste
-
Fájlok összekapcsolása oszlopokban a mezőelválasztók használata alapján.
split
-
Ez a parancs a nagyobb fájlokat kisebbekre darabolhatja a parancs beállításai által meghatározott feltételektől függően.
md5sum
-
Egy fájl MD5 hash-értékének kiszámítására szolgál. A fájl integritásának biztosítása érdekében egy fájl meglévő hash-értékkel való ellenőrzésére is használható.
sha256sum
-
Egy fájl SHA256 hash-értékének kiszámítására szolgál. A fájl integritásának biztosítása érdekében egy fájl meglévő hash-értékkel való ellenőrzésére is használható.
sha512sum
-
Egy fájl SHA512 hash-értékének kiszámítására szolgál. A fájl integritásának biztosítása érdekében egy fájl meglévő hash-értékkel való ellenőrzésére is használható.
Válaszok a gyakorló feladatokra
-
Valaki most adományozott egy laptopot az iskolánknak, és most szeretnénk Linuxot telepíteni rá. Nincs kézikönyv és kénytelenek vagyunk egy USB pendrive-ról bootolni, ahol nincs semmilyen grafika. Kapunk egy shell terminált, és tudjuk, hogy minden processzornak lesz egy sora a
/proc/cpuinfo
fájlban:processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 158 (kihagyott sorok) processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 158 (még több kihagyott sor)
-
A
grep
éswc
parancsok segítségével jelenítsük meg, hogy hány processzorral rendelkezünk!Íme a két lehetőség:
$ cat /proc/cpuinfo | grep processor | wc -l $ grep processor /proc/cpuinfo | wc -l
Most, hogy tudjuk, hogy többféleképpen is megtehetjük ugyanazt a dolgot, mikor érdemes az egyiket vagy a másikat használni? Ez valójában több tényezőtől függ, a két legfontosabb a teljesítmény és az olvashatóság. Legtöbbször shell parancsokat fogunk használni shell szkripteken belül a feladatok automatizálására, és minél nagyobbak és összetettebbek lesznek a szkriptek, annál jobban kell aggódni a gyorsaságuk miatt.
-
Tegyük meg ugyanezt a
sed
használatával agrep
helyett!Most a
grep
helyett nézzük ased
-et:$ sed -n /processor/p /proc/cpuinfo | wc -l
Itt a
sed
-et a-n
paraméterrel használtuk, így ased
nem fog kiírni semmit, kivéve azt, ami aprocessor
kifejezéssel egyezik, ahogyan azt azp
parancs utasítja. Ahogy agrep
megoldásoknál is tettük, awc -l
megszámolja a sorok számát, tehát a processzorok számát.Nézzük a következő példát:
$ sed -n /processor/p /proc/cpuinfo | sed -n '$='
Ez a parancssorozat azonos eredményt ad, mint az előző példa, ahol a
sed
kimenetét awc
parancsba továbbítottuk. A különbség itt az, hogy ahelyett, hogy awc -l
parancsot használnánk a sorok számolásához, ismét ased
parancsot hívjuk meg, hogy ezzel egyenértékű funkciót biztosítsunk. Ismét elnyomjuk ased
kimenetét a-n
opcióval, kivéve azt a kifejezést, amelyet explicit meghívunk, ami a'$='
. Ez a parancs arra utasítja a sed-et, hogy keresse meg az utolsó sort ($), majd jelenítse meg a hozzá tartozó sorszámot (=).
-
-
Vizsgáljuk meg a helyi
/etc/passwd
fájlt agrep
,sed
,head
éstail
parancsokkal az alábbi feladatok szerint:-
Mely felhasználóknak van hozzáférése a Bash shellhez?
$ grep ":/bin/bash$" /etc/passwd
Ezt a választ úgy fogjuk továbbfejleszteni, hogy csak annak a felhasználónak a nevét jelenítjük meg, aki a Bash shell-t használja.
$ grep ":/bin/bash$" /etc/passwd | cut -d: -f1
A felhasználónév az első mező (a
cut
parancs-f1
paramétere) és az/etc/passwd
fájl:
-t használ elválasztóként (acut
parancs-d:
paramétere) agrep
parancs kimenetét egyszerűen átvezetjük a megfelelőcut
parancsba. -
A rendszerünkben különböző felhasználók vannak, akik bizonyos programok kezelésére vagy adminisztrációs céllal léteznek. Nekik nincs hozzáférésük a shellhez. Hány ilyen felhasználó létezik a rendszerben?
Ezt a legegyszerűbben úgy tudhatjuk meg, hogy ha kiíratjuk azokat a fiókokat, amelyek nem használják a Bash shellt:
$ grep -v ":/bin/bash$" /etc/passwd | wc -l
Hány felhasználó és csoport létezik a rendszerben (ne feledjük: csak az
/etc/passwd
fájlt használjuk)?Az
/etc/passwd
fájl bármelyik sorának első mezője a felhasználónév, a második mező általában egyx
, ami azt jelzi, hogy a felhasználói jelszó nem itt van tárolva (az/etc/shadow
fájlban van titkosítva). A harmadik a felhasználói azonosító (UID), a negyedik pedig a csoport azonosítója (GID). Ez tehát meg kell, hogy adja a felhasználók számát:$ cut -d: -f3 /etc/passwd | wc -l
Nos, az esetek többségében igen. Vannak azonban olyan helyzetek, amikor különböző szuperfelhasználókat vagy más speciális típusú felhasználókat állítunk be, akik ugyanazt az UID-t (felhasználói azonosítót) használják. Tehát a biztonság kedvéért a
cut
parancsunk eredményét átvezetjük asort
parancsba, majd megszámoljuk a sorok számát.$ cut -d: -f3 /etc/passwd | sort -u | wc -l
Most a csoportok száma:
$ cut -d: -f4 /etc/passwd | sort -u | wc -l
-
Csak az
/etc/passwd
fájl első, utolsó és tizedik sorát listázzuk ki!Ez megoldja:
$ sed -n -e '1'p -e '10'p -e '$'p /etc/passwd
Ne feledjük, hogy a
-n
paraméter azt mondja ased
-nek, hogy ne írjon ki semmi mást, mint amit azp
parancs megad! Az itt használt dollárjel ($
) egy reguláris kifejezés, amely a fájl utolsó sorát jelenti.
-
-
Vegyük például az alábbi
/etc/passwd
fájlt. Másoljuk az alábbi sorokat egymypasswd
nevű helyi fájlba a gyakorláshoz!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 nvidia-persistenced:x:121:128:NVIDIA Persistence Daemon,,,:/nonexistent:/sbin/nologin libvirt-qemu:x:64055:130:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:122:133:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash dave:x:1001:1000:Dave Edwards,Finance,,,Main Office:/home/dave:/bin/ksh emma:x:1002:1000:Emma Jones,Finance,,,Main Office:/home/emma:/bin/bash frank:x:1003:1000:Frank Cassidy,Finance,,,Main Office:/home/frank:/bin/bash grace:x:1004:1000:Grace Kearns,Engineering,,,Main Office:/home/grace:/bin/ksh henry:x:1005:1000:Henry Adams,Sales,,,Main Office:/home/henry:/bin/bash john:x:1006:1000:John Chapel,Sales,,,Main Office:/home/john:/bin/bash
-
Listázzuk ki az összes felhasználót az
1000
csoportból (használjuk ased
-et a megfelelő mezőt kiválasztásához) amypasswd
fájlból!A GID a negyedik mező az
/etc/passwd
fájlban. Lehet, hogy megpróbáljuk ezt:$ sed -n /1000/p mypasswd
Ebben az esetben ezt a sort fogjuk kapni:
carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash
Tudjuk, hogy ez nem helyes, mivel Carol Smith a GID 2000 tagja, és az egyezés az UID miatt történt. Azonban észrevehettük, hogy a GID után a következő mező nagybetűvel kezdődik. Ezt a problémát egy reguláris kifejezéssel tudjuk megoldani.
$ sed -n /:1000:[A-Z]/p mypasswd
A
[A-Z]
kifejezés bármelyik nagybetűs karakterrel megegyezik. Erről többet fogunk megtudni a megfelelő leckében. -
Listázzuk ki csak a felhasználók teljes nevét ebből a csoportból (a
sed
éscut
használatával)!Használjuk ugyanazt a technikát, amit a feladat első részének megoldásához használtunk és vezessük át a
cut
parancsba!$ sed -n /:1000:[A-Z]/p mypasswd | cut -d: -f5 Dave Edwards,Finance,,,Main Office Emma Jones,Finance,,,Main Office Frank Cassidy,Finance,,,Main Office Grace Kearns,Engineering,,,Main Office Henry Adams,Sales,,,Main Office John Chapel,Sales,,,Main Office
Nem egészen ez még a megoldás! Figyeljük meg, hogy a mezők az eredményeken belül
,
-vel elválaszthatók. Ezért a kimenetet egy másikcut
parancsba fogjuk átvezetni, a,
-t használva delimiterként.$ sed -n /:1000:[A-Z]/p mypasswd | cut -d: -f5 | cut -d, -f1 Dave Edwards Emma Jones Frank Cassidy Grace Kearns Henry Adams John Chapel
-
Válaszok a gondolkodtató feladatokra
-
Ismét az előző feladatokban használt
mypasswd
fájl segítségével találjunk ki egy Bash-parancsot, amely kiválaszt egy személyt a Main Office-ból (Fő Irodából), aki megnyeri a tombolaversenyt. Ased
paranccsal csak a Main Office sorait listázzuk ki, majd egycut
parancssorozattal nyerjük ki az egyes felhasználók keresztnevét ezekből a sorokból. Ezután ezeket a neveket rendezzük véletlenszerűen, és a listából csak a legfelső nevet írassuk ki!Először vizsgáljuk meg, hogy a
-R
paraméter hogyan módosítja asort
parancs kimenetét. Ismételjük meg ezt a parancsot néhányszor (vegyük figyelembe, hogy a 'Main Office'-t aposztrófok közé kell zárnunk, így ased
egyetlen sztringként kezelje):$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1 | sort -R
Íme a megoldás a problémára:
$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1 | sort -R | head -1
-
Hányan dolgoznak a Finance (pénzügyi), a Engineering (mérnöki) és az Sales (értékesítési) területeken? (Fontoljuk meg a
uniq
parancs használatát!)Folytassa a korábbi gyakorlatok során tanultakra építve. Próbálja ki a következőket:
$ sed -n /'Main Office'/p mypasswd $ sed -n /'Main Office'/p mypasswd | cut -d, -f2
Vegyük észre, hogy most már nem törődünk a
:
-al, mint delimiterrel. Nekünk csak a második mező kell, amikor a,
karakterekkel választjuk el a sorokat.$ sed -n /'Main Office'/p mypasswd | cut -d, -f2 | uniq -c 4 Finance 1 Engineering 2 Sales
A
uniq
parancs csak az egyedi sorokat adja ki (az ismétlődő sorokat nem), a-c
paraméter pedig arra utasítja azuniq
parancsot, hogy számolja az egyenlő sorok előfordulásait. Van itt egy figyelmeztetés: Auniq
csak a szomszédos sorokat veszi figyelembe. Ha ez nem megfelelő, akkor asort
parancsot kell használni. -
Most egy CSV (comma separeted values - vesszővel elválasztott értékek) fájlt kell készítenünk, hogy az előző példában szereplő
mypasswd
fájlból könnyen importálhassuk anames.csv
fájlt a LibreOffice-ba. A fájl tartalma a következő formátumú lesz:First Name,Last Name,Position Carol,Smith,Finance ... John,Chapel,Sales
Tipp: Használjuk a
sed
,cut
, éspaste
parancsokat az elvárt eredmények eléréséhez! Vegyük figyelembe, hogy a vessző (,
) lesz a delimiter ennél a fájlnál!Kezdjük a
sed
éscut
parancsokkal, az előző gyakorlatokban tanultakra építve:$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d" " -f1 > firstname
Most már megvan a
firstname
fájl az alkalmazottaink keresztneveivel.$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d" " -f2 | cut -d, -f1 > lastname
Most megvan a
lastname
fájl az alkalmazottak vezetékneveivel.Ezután meghatározzuk, hogy az egyes alkalmazottak melyik osztályon dolgoznak:
$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f2 > department
Mielőtt a végleges megoldáson dolgoznánk, próbáljuk ki a következő parancsokat, hogy lássuk, milyen kimenetet generálnak:
$ cat firstname lastname department $ paste firstname lastname department
És most a végleges megoldás:
$ paste firstname lastname department | tr '\t' , $ paste firstname lastname department | tr '\t' , > names.csv
Itt a
tr
parancsot használjuk a\t
, a tabulátor elválasztójel,
-vel történő cseréjére (translate). Atr
nagyon hasznos, amikor egy karaktert egy másikra kell cserélnünk. Mindenképpen olvassuk el atr
és apaste
man oldalakat! Például használhatjuk a-d
opciót az elválasztójelhez, hogy az előző parancsot kevésbé bonyolulttá tegyük:$ paste -d, firstname lastname department
A
paste
parancsot itt egyszer használtuk, hogy megismerkedjünk vele. Azonban könnyen elvégezhettük volna az összes feladatot egyetlen parancslánccal is:$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1,2 | tr ' ' , > names.csv
-
Tegyük fel, hogy az előző feladatban létrehozott
names.csv
táblázat egy fontos fájl, és szeretnénk biztosítani, hogy senki ne piszkálhassa attól a pillanattól kezdve, hogy elküldjük valakinek, és attól a pillanattól kezdve, hogy a címzett megkapja. Hogyan biztosíthatjuk ennek a fájlnak az integritását azmd5sum
segítségével?Ha megnézzük az
md5sum
,sha256sum
éssha512sum
man oldalait, azt fogjuk látni, hogy mindegyik az alábbi szöveggel kezdődik:"`compute and check XXX message digest` (XXX üzenetkivonatoló kiszámítása és ellenőrzése) "
Ahol “XXX” az az algoritmus, amelyet az üzenetkivonatoló (message digest) létrehozására használnak.
Az
md5sum
-ot fogjuk példaként használni, később pedig kipróbálhatjuk a többi parancsot is!$ md5sum names.csv 61f0251fcab61d9575b1d0cbf0195e25 names.csv
Most például elérhetővé tehetjük a fájlt egy biztonságos ftp szolgáltatáson keresztül, és a generált message digest üzenetet egy másik biztonságos kommunikációs eszközzel küldhetjük el. Ha a fájlt kissé módosították, a message digest teljesen más lesz. Csak a bizonyítás kedvéért, szerkesszük meg a
names.csv
állományt, és változtassuk meg Jones-t James-re, ahogy itt látható:$ sed -i.backup s/Jones/James/ names.csv $ md5sum names.csv f44a0d68cb480466099021bf6d6d2e65 names.csv
Amikor fájlokat teszünk elérhetővé letöltésre, mindig jó gyakorlat, ha egy message digest-et is terjesztünk, hogy azok, akik letöltik a fájlt, új message digestet készíthessenek, és összevethessék az eredetivel. Ha átböngésszük a https://kernel.org oldalt, megtaláljuk a https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/sha256sums.asc oldalt, ahol a letölthető fájlok sha256sum-ot kaphatjuk meg.
-
Eldöntöttük, hogy naponta 100 sort olvasunk egy klasszikus könyvből, és úgy döntöttünk, hogy Herman Melville Mariner and Mystic című művével kezdjük. Találjunk ki egy olyan parancsot a
split
segítségével, amely ezt a könyvet 100 soros szakaszokra osztja. Ahhoz, hogy a könyvet egyszerű szöveges formátumban megkapjuk, keressük azt meg a https://www.gutenberg.org címen.Először a teljes könyvet a Project Gutenberg oldalról fogjuk megszerezni, ahol ez és más, közkinccsé tett könyvek is elérhetőek.
$ wget https://www.gutenberg.org/files/50461/50461-0.txt
Lehet, hogy telepítenünk kell a
wget
-et, ha még nincs feltelepítve. Alternatívaként használhatjuk acurl
-t. A könyv ellenőrzéséhez használhatjuk aless
-t:$ less 50461-0.txt
Most a könyvet egyenként 100 soros részekre osztjuk:
$ split -l 100 -d 50461-0.txt melville
50461-0.txt
a fájl, amit feldarabolunk. Amelville
a töredékfájlok prefixe. A-l 100
határozza meg a sorok számát és a-d
kapcsoló mondja meg asplit
-nek, hogy számozza a fájlokat (a megadott suffix használatával). Használhatjuk aznl
-t bármelyik töredékfájlon (lehetőleg ne a legutolsón), hogy megerősítsük, hogy mindegyik 100 soros. -
Az
ls -l
használatával a/etc
mappában milyen listát kapunk? Acut
parancsot használva az adottls
parancs kimenetén hogyan jeleníthetnénk meg csak a fájlneveket? Mi a helyzet a fájlnevekkel és a fájlok tulajdonosával? Azls -l
és acut
parancsok mellett használjuk atr
parancsot a szóköz többszörös előfordulásának egyetlen szóközzé való összenyomására (squeeze), hogy segítsük a kimenet formázását acut
paranccsal!Az
ls
parancs önmagában csak a fájlok nevét adja meg. Azls -l
(a hosszú listázás, long list) kimenetét azonban előkészíthetjük a pontosabb információk kinyeréséhez.$ ls -l /etc | tr -s ' ' , drwxr-xr-x,3,root,root,4096,out,24,16:58,acpi -rw-r--r--,1,root,root,3028,dez,17,2018,adduser.conf -rw-r--r--,1,root,root,10,out,2,17:38,adjtime drwxr-xr-x,2,root,root,12288,out,31,09:40,alternatives -rw-r--r--,1,root,root,401,mai,29,2017,anacrontab -rw-r--r--,1,root,root,433,out,1,2017,apg.conf drwxr-xr-x,6,root,root,4096,dez,17,2018,apm drwxr-xr-x,3,root,root,4096,out,24,16:58,apparmor drwxr-xr-x,9,root,root,4096,nov,6,20:20,apparmor.d
Az
-s
paraméter utasítja aztr
-t, hogy az ismétlődő szóközöket egyetlen szóközpéldánnyá zsugorítsa. Atr
parancs bármilyen megadott ismétlődő karakterrel működik. Ezután a szóközöket vesszővel,
helyettesítjük. Példánkban valójában nincs szükségünk a szóközök helyettesítésére, ezért a,
-t egyszerűen elhagyjuk.$ ls -l /etc | tr -s ' ' drwxr-xr-x 3 root root 4096 out 24 16:58 acpi -rw-r--r-- 1 root root 3028 dez 17 2018 adduser.conf -rw-r--r-- 1 root root 10 out 2 17:38 adjtime drwxr-xr-x 2 root root 12288 out 31 09:40 alternatives -rw-r--r-- 1 root root 401 mai 29 2017 anacrontab -rw-r--r-- 1 root root 433 out 1 2017 apg.conf drwxr-xr-x 6 root root 4096 dez 17 2018 apm drwxr-xr-x 3 root root 4096 out 24 16:58 apparmor
Ha csak a fájlneveket akarjuk, akkor csak a kilencedik mezőt kell megjeleníteni:
$ ls -l /etc | tr -s ' ' | cut -d" " -f9
A fájl nevéhez és tulajdonosához a kilencedik és a harmadik mezőre lesz szükségünk:
$ ls -l /etc | tr -s ' ' | cut -d" " -f9,3
Mi van, ha csak a mappák nevére és tulajdonosára van szükségünk?
$ ls -l /etc | grep ^d | tr -s ' ' | cut -d" " -f9,3
-
Ez a gyakorlat azt feltételezi, hogy egy valódi gépet (nem virtuális gépet) használunk. Egy USB-pendrive is legyen nálunk. Nézzük át a
tail
parancs kézikönyvének oldalait, és találjuk meg, hogyan követhetünk egy fájlt, amihez szöveg hozzá van csatolva. Miközben atail
parancs kimenetét figyeljük a/var/log/syslog
fájlban, helyezzünk be egy USB-pendrive-ot. Írjuk ki a teljes parancsot, amellyel az USB-stick terméknevét, gyártóját és teljes memóriamennyiségét szeretnénk megtudni!$ tail -f /var/log/syslog | grep -i 'product\:\|blocks\|manufacturer' Nov 8 06:01:35 brod-avell kernel: [124954.369361] usb 1-4.3: Product: Cruzer Blade Nov 8 06:01:35 brod-avell kernel: [124954.369364] usb 1-4.3: Manufacturer: SanDisk Nov 8 06:01:37 brod-avell kernel: [124955.419267] sd 2:0:0:0: [sdc] 61056064 512-byte logical blocks: (31.3 GB/29.1 GiB)
Természetesen ez csak egy példa, és az eredmények az USB-pendrive gyártójától függően változhatnak. Vegyük észre, hogy most az
-i
paramétert használjuk agrep
paranccsal, mivel nem vagyunk biztosak abban, hogy a keresett sztringek kis- vagy nagybetűsek voltak-e. A|
logikai VAGY-ot is használtuk, így aproduct
VAGYblocks
VAGYmanufacturer
tartalmú sorokat keressük.