Szöveges állományok

Ahogyan a könyvtárműveletek kapcsán említettük, a unix-alapú rendszerekben meghatározó szerepe van az állományoknak. Ezen belül is kiemelt szerepet játszanak a szöveges állományok; sok parancsot kifejezetten az ezekkel végzett munkához terveztek meg.

Az egyszerűbbek közé tartozik a wc, amely megszámolja a szöveges állomány sorait, szavait és byte-jait:

tux@madas:~/public_html/txt/mp$ wc ksh_hnk_1913 
 12542  12552 149995 ksh_hnk_1913
tux@madas:~/public_html/txt/mp$ 

Pontosítva, illetve egyértelműsítve az imént mondottakat: a wc parancs a sorvégjeleket számolja, továbbá nem karaktereket, hanem valóban byte-okat számol. (Miért különbözhetik a sorok és a sorvégjelek száma? Mekkora lehet a különbség? Miért különbözhetik a byte-ok és a karakterek száma? Hányszoros lehet az eltérés?)

Előfordulhat, hogy a három adat közül csak az egyikre van szükségünk: a -l opcióval például a sorok számát fogjuk megkapni:

tux@madas:~/public_html/txt/mp$ wc -l ksh_hnk_1913 
12542 ksh_hnk_1913
tux@madas:~/public_html/txt/mp$ 

Érdemes megjegyezni, hogy a -l különböző esetekben mást és mást jelenthet: az eddigiekben rövidítette már a long, illetve a line szót. Általánosságban is elmondható, hogy akár parancsok neve (illetve a rövidtés módja), akár az opciók megválasztása nem föltétlenül mutat koherens rendet.

Jó példa erre a creat nevű rendszerhívás – ez arról híresült el, hogy amikor a unix egyik alkotóját, a Turing-díjas Ken Thompsont megkérdezték, mit tenne másként, ha újratervezné a rendszert, azt a választ adta, hogy e-vel írná a creat szót.

A cat parancs –alapesetben– képernyőre írja egy állomány tartalmát. A segítségével megállapíthatjuk például, mi a szöveges állomány tartalma:

tux@madas:~/public_html/txt/mp$ cat ksh_hnk_1913 
…
 zólyomternye
 bábaszék
 dobronya
 tótpelsőcz
 beszterczebánya
 breznóbánya
 zólyom
(12538 rows)

tux@madas:~/public_html/txt/mp$ 

Természetesen a 12542 (vagy 12538?) sor nem fér el a képernyőn. A head paranccsal viszont kiírathatjuk az állomány elejét (alapértelmezés szerint az első tíz sort):

tux@madas:~/public_html/txt/mp$ head ksh_hnk_1913 
             hn              
-----------------------------
 buzita
 komarócz
 reste
 szeszta
 bodoló
 csécs
 makrancz
 pány
tux@madas:~/public_html/txt/mp$ 

Ezzel egyúttal megkaptuk a magyarázatot is a négysornyi eltérésre: az állomány 12542 sorából az első kettő, illetve az utolsó kettő nem számít a 12538-ba.

Az állományban a Magyar Királyság utolsó, az 1910-es népszámlálás adatait is tartalmazó helységnévtárának településnevei szerepelnek, szám szerint 12538. A kimenet egy postgres-adatbázisból származik, s a psql parancs alaphelyzetben kiírja a mezőnevet (hn), egy határoló vonalat, majd a rekordok után azok számát, s egy üres sort.

A head parancsnak a -n opcióval adhatjuk meg, hány sort szeretnénk látni:

tux@madas:~/public_html/txt/mp$ head -n +4 ksh_hnk_1913 
             hn              
-----------------------------
 buzita
 komarócz
tux@madas:~/public_html/txt/mp$ 

Az előző parancs természetes párja a tail: ez az állomány végét írja ki (erre vonatkozó argumentum híján ugyancsak tízet):

tux@madas:~/public_html/txt/mp$ tail ksh_hnk_1913 
 zólyomszabadi
 zólyomternye
 bábaszék
 dobronya
 tótpelsőcz
 beszterczebánya
 breznóbánya
 zólyom
(12538 rows)

tux@madas:~/public_html/txt/mp$ 

Ebben az esetben is van -n kapcsoló:

tux@madas:~/public_html/txt/mp$ tail -n -4 ksh_hnk_1913 
 breznóbánya
 zólyom
(12538 rows)

tux@madas:~/public_html/txt/mp$ 

Vajon miért írtunk egyszer +4-et, másszor -4-et?

tux@madas:~/public_html/txt/mp$ head -n -2 ksh_hnk_1913 
…
 vaségető
 zólyomszabadi
 zólyomternye
 bábaszék
 dobronya
 tótpelsőcz
 beszterczebánya
 breznóbánya
 zólyom
tux@madas:~/public_html/txt/mp$
tux@madas:~/public_html/txt/mp$ tail -n +3 ksh_hnk_1913 
…
 zólyomternye
 bábaszék
 dobronya
 tótpelsőcz
 beszterczebánya
 breznóbánya
 zólyom
(12538 rows)

tux@madas:~/public_html/txt/mp$ 

Mi lesz a következő parancsok eredménye?

tux@madas:~/public_html/txt/mp$ head -n -12538 ksh_hnk_1913
tux@madas:~/public_html/txt/mp$ head -n     +4 ksh_hnk_1913
tux@madas:~/public_html/txt/mp$ tail -n     -4 ksh_hnk_1913
tux@madas:~/public_html/txt/mp$ tail -n +12538 ksh_hnk_1913