3.2 Lecke 1
Tanúsítvány: |
Linux Essentials |
---|---|
Verzió: |
1.6 |
Témakör: |
3 A Paranccsor Erősségei |
Fejezet: |
3.2 Adatok Keresése és Kinyerése Fájlokból |
Lecke: |
1/2 |
Bevezetés
Ebben a gyakorlatban azokra a speciális eszközökre fogunk összpontosítani, amikkel információkat egyik forrásból a másikba tudunk átirányítani vagy továbbítani. A Linux parancssora meghatározott szabványos csatornákon keresztül irányítja át az információkat. A parancs alapértelmezett bemenete (stdin vagy channel 0) a billentyűzet és az alapértelmezett kimenete (stdout vagy channel 1) a képernyő. Van egy másik csatorna is, amely a parancs vagy a program hibaüzeneteinek átirányítására szolgál (stderr vagy channel 2). A bemenet és/vagy a kimenet átirányítható.
Parancsok futtatása során előfordul, hogy bizonyos információkat át akarunk adni a parancsnak vagy a parancs kimenetét egy adott fájlnak. Ezeket a funkciókat tárgyaljuk a következő két szakaszban.
I/O Átirányítás
Az I/O átirányítás lehetővé teszi a felhasználó számára, hogy egy szöveges fájl használatával átirányítsa az információkat a parancsokból vagy a parancsokba. Ahogy korábban leírtuk, a standard input, output vagy error output átirányítható és az információ szövegfájlokból átvehető.
A Standard Output Átirányítása
Ahhoz, hogy a standard kimenetet egy fájlba írjuk a képernyő helyett, a >
operátort kell használnunk, mely után a fájl nevét kell megadni. Ha a fájl nem létezik, létrejön, viszont ha már létezik, az információ felül fogja írni a tartalmát.
Az imént létrehozott fájl tartalmának megtekintéséhez használhatjuk a cat
parancsot. Alapértelmezés szerint ez a parancs egy fájl tartalmát jeleníti meg a képernyőn. A megfelelő man oldalon több részletet is megtudhatunk a funkcióiról.
Az alábbi példa demonstrálja az operátor használatát. Az első esetben egy új fájl jön létre, amely a “Hello World!” szöveget tartalmazza:
$ echo "Hello World!" > text $ cat text Hello World!
A második meghívás során ugyanazt a fájlt felülírja az új szöveg:
$ echo "Hello!" > text $ cat text Hello!
Ha új információt akarunk a fájl végéhez hozzáfűzni, a >>
operátorra van szükség. Ez az operátor szintén létrehozza a fájlt, ha még nem létezik.
Első példánk a szöveg hozzáadását mutatja. Ahogy láthatjuk, az új string a következő sorba került:
$ echo "Hello to you too!" >> text $ cat text Hello! Hello to you too!
A második példában láthatjuk egy új fájl létrejöttét:
$ echo "Hello to you too!" >> text2 $ cat text2 Hello to you too!
A Standard Error Átirányítása
Annak érdekében, hogy csak a hibaüzeneteket irányítsuk át, a 2>
operátort kell használnunk, amit annak a fájlnak a neve követ, amibe a hibaüzeneket írni szeretnénk. Ha a fájl nem létezik, létrejön, viszont ha már létezik, az információ felül fogja írni a tartalmát.
Ahogy már említettük, alapértelmezett hibák továbbítására a csatorna a channel 2. A standard hiba továbbítása esetén muszáj meghatározni a csatornát, szemben a másik standard outputtal, ahol a channel 1 az alapértelmezett. Például a következő parancs a games
nevű fájlt vagy mappát keresi és csak a hibaüzeneteket írja a text-error
fájlba, míg az alapértelmezett kimenetet a képernyőre írja:
$ find /usr games 2> text-error /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games $ cat text-error find: `games': No such file or directory
Note
|
A |
A következő parancs hibátlanul fog lefutni, így nem ír semmit a text-error
fájlba:
$ sort /etc/passwd 2> text-error $ cat text-error
Ahogy a standard kimenet, a standard hibaüzenet is hozzáfűzhető egy fájlhoz a 2>>
operátorral. Ez hozzáfűzi az új hibát a fájl végéhez. Ha a fájl nem létezik, új fájl jön létre. Az első példában új információk hozzáadását láthatjuk, a második példában pedig a parancs új fájlt hoz létre, mivel nem létezik fájl ilyen névvel:
$ sort /etc 2>> text-error $ cat text-error sort: read failed: /etc: Is a directory
$ sort /etc/shadow 2>> text-error2 $ cat text-error2 sort: open failed: /etc/shadow: Permission denied
Az ilyen típusú átirányítás során csak az error üzenetek kerülnek a fájlba, a normál kimenet a képernyőre íródik vagy a standard kimeneten vagy stdout-on.
Létezik egy bizonyos fájl, ami technikailag egy bit bucket (egy olyan fájl, ami fogad bemenetet, de nem csinál vele semmit): /dev/null
. Átirányíthatunk bele minden irreleváns információt, amit nem akarunk megjeleníteni vagy fájlba írni, ahogy az az alábbi példán is látható:
$ sort /etc 2> /dev/null
A Standard Input Átirányítása
Ezzel a típusú átirányítással adatot adhatunk át egy parancsnak egy meghatározott fájlból a billentyűzet helyett. Ebben az esetben a <
operátort használjuk, ahogy példánkban is látható:
$ cat < text Hello! Hello to you too!
A standard input átirányítását általában olyan parancsokkal használjuk, amelyek nem fogadnak el fájlokat argumentumként. A tr
parancs egy közülük. Ezzel a paranccsal lefordíthatjuk egy fájl tartalmát úgy, hogy a fájl karaktereit meghatározott módon módosítjuk, például törlünk egy karaktert a fájlból - az alábbi példa az l
karakter törlését mutatja be:
$ tr -d "l" < text Heo! Heo to you too!
További információkat a tr
man oldalán találhatunk.
Here Dokumentumok
A kimenetek átirányításától eltérően, a <<
operátor másképp viselkedik, mint a többi operátor. Ezt a bemeneti adatfolyamot here document-nek nevezik. A here document a kód vagy szöveg azon blokkját jelenti, amely parancsnak vagy programnak átadható. A különböző szkriptnyelvek, mint a bash
, sh
és csh
képesek közvetlenül a parancssorból érkező bemeneteket értelmezni, bármilyen szövegfájl használata nélkül.
Ahogy az alábbi példában látható, az operátorral adatokat adhatunk át egy parancsnak, míg az utána következő szó nem határozza meg a fájl nevét. A szó itt egy delimiter, nem tekintjük tartalomnak, ezért a cat
nem fogja megjeleníteni:
$ cat << hello > hey > ola > hello hey ola
A cat
man oldalán több információt is találhatunk.
Kombinációk
Az első kombináció, amellyel foglalkozunk, egyesíti a standard output és az error output kiírását ugyanabba a fájlba. A &>
és a &>>
operátorokat használjuk, a &
reprezentálja a channel 1 és a channel 2 kombinálását. Az első operátor felülírja a fájl már létező tartalmát, a második pedig hozzáfűzi az információt a fájl végéhez. Mindkét operátor lehetővé teszi az új fájl létrehozását, ahogy az a korábbiakban is volt:
$ find /usr admin &> newfile $ cat newfile /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games find: `admin': No such file or directory $ find /etc/calendar &>> newfile $ cat newfile /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games find: `admin': No such file or directory /etc/calendar /etc/calendar/default
Nézzünk egy példát a cut
parancs használatára:
$ cut -f 3 -d "/" newfile $ cat newfile share share share ---------Omitted output---------- lib games find: `admin': No such file or directory calendar calendar find: `admin': No such file or directory
A cut
parancs kivágja a meghatározott mezőket a fájlból az -f
kapcsolóval - ez esetünkben a 3. mező. Annak érdekében, hogy a parancs megtalálja a mezőt, a -d
kapcsolóval meg kell adnunk egy delimitert. A mi esetünkben ez a /
karakter.
A cut
parancsról több információt a man oldalán találhatunk.
Parancssori Csővezetékek
Az átirányítást többnyire egy parancs eredményének tárolására használjuk, amelyet egy másik parancs fog feldolgozni. Ez a típusú közbeiktatás azonban unalmassá és komplikálttá is válhat, ha az adatot több különböző folyamatnak akarjuk átadni. Annak érdekében, hogy ezt elkerüljük, közvetlenül is átadhatjuk a csővezeték (pipe) segítségével. Más szóval az első parancs kimenete automatikusan a második parancs bemenete lesz. Ezt a |
(függőleges vonal) operátorral érhetjük el:
$ cat /etc/passwd | less root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh :
A fenti példában a csővezeték utáni less
parancs módosítja, hogy hogy jelenjen meg a fájl. A less
parancs úgy jeleníti meg a szöveget, hogy lehetővé teszi a felhasználónak a görgetést. Alapértelmezésben a less
jeleníti meg a man oldalakat is, ahogy azt a korábbi leckékben már tárgyaltuk.
Lehetőségünk van több csővezeték egyidejű használatára is. Azokat a közbeiktatott parancsokat, amik bemenetet fogadnak és módosítják a kimenetet, szűrőnek (filter) nevezzük. Vegyük az ls -l
parancsot és próbáljuk meg megszámolni az első 10 sor szavait. Ahhoz, hogy ez sikerüljön, a head
parancsot kell használnunk, ami alapértelmezésben egy fájl első 10 sorát jeleníti meg és ezután számolhatjuk meg a szavakat a wc
paranccsal:
$ ls -l | head | wc -w 10
Ahogy korábban említettük, a head
alapértelmezetten a szöveges fájl első 10 sorát jeleníti meg. Ez a tulajdonsága speciális kapcsolókkal megváltoztatható - a parancs man oldalán többet is megtudhatunk.
Van egy parancs, amellyel megjeleníthetjük egy fájl végét: tail
. Alapértelmezetten a parancs a fájl utolsó 10 sorát választja ki és jeleníti meg, de ahogy a head
esetén, a szám itt is megváltoztatható. A tail
man oldalán megtalálhatjuk a részleteket.
Note
|
Az |
A wc
(word count - szószámlálás) parancs egy fájl sorait, szavait és bájtjait számolja meg. Ahogy a gyakorlatban láthattuk, a -w
kapcsoló arra instruálja, hogy csak a szavakat számolja meg a kiválasztott sorokban. A parancs esetén használható leggyakoribb kapcsolók: -l
, amely esetén csak a sorokat számolja meg, -c
esetén csak a bájtokat. Több variáció és kapcsoló, valamint több információ a wc
parancsról megtalálható a man oldalán.
Gyakorló Feladatok
-
Listázzuk az aktuális mappa tartalmát, beleértve a tulajdonosokat és a jogosultságokat is, és írjuk a kimenetet a home mappában található
contents.txt
fájlba! -
Rendezzük a
contents.txt
tartalmát és fűzzük hozzá egy új fájl végéhez, aminek a neve`contents-sorted.txt`! -
Jelenítsük meg az
/etc/passwd
fájl utolsó 10 sorát és iráyítsuk át egy új fájlba aDocuments
mappában! -
Számoljuk meg a
contents.txt
fájlban található szavakat és a kimenetet fűzzük hozzá afield2.txt
fájl végéhez a home mappánkban! Mind az input, mind az output átirányítást használnunk kell! -
Jelenítsük meg az
/etc/passwd
fájl első öt sorát és rendezzük a kimenetet fordított ABC-sorrendbe! -
Számoljuk meg az utolsó 9 sor karaktereinek a számát az előzőleg létrehozott
contents.txt
fájlban! -
Számoljuk meg a
test
nevű fájlokat a/usr/share
mappában és annak almappáiban! Ne feledjük: afind
parancs kimenetének minden sora egy fájlt jelent!
Gondolkodtató Feladatok
-
Válasszuk ki a
contents.txt
második mezőjét és irányítsuk át a standard kimenetet és a hibaüzeneteket egyfield1.txt
nevű fájlba! -
A bemenet átirányításához szükséges operátor és a
tr
parancs segítségével töröljük a kötőjeleket (-
) acontents.txt
fájlból! -
Mi a legnagyobb előnye, ha csak a hibaüzeneteket irányítjuk át egy fájlba?
-
Cseréljük a többszörös szóközöket a sorbarendezett
contents.txt
fájlban sima szóközre! -
Távolítsuk el a parancssorban a többszörös szóközöket (ahogy az előző leckében tettük), válasszuk ki a 9. mezőt és rendezzük fordított ABC-sorrendbe non-case sensitive módon! Hány csővezetéket kell használnunk?
Összefoglalás
Ebben a leckében megtanultuk:
-
Az átirányítás típusait
-
Hogyan használjuk az átirányító operátorokat
-
Hogyan szűrjük a kimenetet csővezetékekkel
A leckében az alábbi parancsokat használtuk:
cut
-
Szekciók eltávolítása egy fájl minden sorából.
cat
-
Fájlok megjelenítése vagy összefűzése.
find
-
Fájlok keresése egy mappastruktúrában.
less
-
Fájl tartalmának megjelenítése, lehetővé téve egyszerre egy sor görgetését.
more
-
Egy fájl egy oldalának megjelenítése.
head
-
Egy fájl első 10 sorának megjelenítése.
tail
-
Egy fájl utolsó 10 sorának megjelenítése.
sort
-
Fájlok rendezése.
wc
-
Egy fájl sorainak, szavainak vagy bájtjainak a megszámlálása.
Válaszok a Gyakorló Feladatokra
-
Listázzuk az aktuális mappa tartalmát, beleértve a tulajdonosokat és a jogosultságokat is, és írjuk a kimenetet a home mappában található
contents.txt
fájlba!$ ls -l > contents.txt
-
Rendezzük a
contents.txt
tartalmát és fűzzük hozzá egy új fájl végéhez, aminek a neve`contents-sorted.txt`!$ sort contents.txt >> contents-sorted.txt
-
Jelenítsük meg az
/etc/passwd
fájl utolsó 10 sorát és irányítsuk át egy új fájlba aDocuments
mappában!$ tail /etc/passwd > Documents/newfile
-
Számoljuk meg a
contents.txt
fájlban található szavakat és a kimenetet fűzzük hozzá afield2.txt
fájl végéhez a home mappánkban! Mind az input, mind az output átirányítást használnunk kell!$ wc < contents.txt >> field2.txt
-
Jelenítsük meg az
/etc/passwd
fájl első öt sorát és rendezzük a kimenetet fordított ABC-sorrendben!$ head -n 5 /etc/passwd | sort -r
-
Számoljuk meg az utolsó 9 sor karaktereinek a számát az előzőleg létrehozott
contents.txt
fájlban!$ tail -n 9 contents.txt | wc -c 531
-
Számoljuk meg a
test
nevű fájlokat a/usr/share
mappában és annak almappáiban! Ne feledjük: afind
parancs kimenetének minden sora egy fájlt jelent!$ find /usr/share -name test | wc -l 125
Válaszok a Gondolkodtató Feladatokra
-
Válasszuk ki a
contents.txt
második mezőjét és irányítsuk át a standard kimenetet és a hibaüzeneteket egyfield1.txt
nevű fájlba!$ cut -f 2 -d " " contents.txt &> field1.txt
-
A bemenet átirányításához szükséges operátor és a
tr
parancs segítségével töröljük a kötőjeleket (-
) acontents.txt
fájlból!$ tr -d "-" < contents.txt
-
Mi a legnagyobb előnye, ha csak a hibaüzeneteket irányítjuk át egy fájlba?
Ha csak a hibaüzeneteket továbbítjuk, segíthet abban, hogy legyen egy rendszeresen monitorozható log fájlunk.
-
Cseréljük a többszörös szóközöket a sorbarendezett
contents.txt
fájlban sima szóközre!$ sort contents.txt | tr -s " "
-
Távolítsuk el a parancssorban a többszörös szóközöket (ahogy az előző leckében tettük), válasszuk ki a 9. mezőt és rendezzük fordított ABC-sorrendbe non-case sensitive módon! Hány csővezetéket kell használnunk?
$ cat contents.txt | tr -s " " | cut -f 9 -d " " | sort -fr
A gyakorlat 3 csővezetéket használ, minden szűrőhöz egyet.