Csövek

A kimenet átirányításáról írtak kapcsán láthattuk, hogy ha egy szöveges állományt egymást követően több paranccsal akarunk földolgozni, akkor ehhez fölhasználhatunk egy átmeneti állományt:

tux@madas:~/public_html/txt/mp$ head -n -2 ksh_hnk_1913 > temp
tux@madas:~/public_html/txt/mp$ tail -n +3 temp > ksh_hnk_1913.txT
tux@madas:~/public_html/txt/mp$ rm temp 

Valójában az átmeneti állományra nincs szükség: az első parancs kimenete lehet a második parancs bemenete. Ezt a szerkezetet (a | jellel összekapcsolt parancsokat) hívjuk csőnek vagy csővezetéknek:

tux@madas:~/public_html/txt/mp$ head -n -2 ksh_hnk_1913 | tail -n +3 > ksh_hnk_1913.Txt
tux@madas:~/public_html/txt/mp$ 

A diff paranccsal ellenőrizhetjük, hogy a korábban, illetve a most kapott két állomány megegyezik-e:

tux@madas:~/public_html/txt/mp$ diff ksh_hnk_1913.txT ksh_hnk_1913.Txt
tux@madas:~/public_html/txt/mp$ 

A unix/linux világában megszokottak szerint nincs harsonaszó, nem zengenek fanfárok: ha a parancs végrehajtása rendben lezajlott, akkor a rendszer nem ad visszajelzést. Ugyanez érvényes most is: nincs eltérés, nincs mondanivaló.

De mi a helyzet akkor, ha van eltérés?

A korabeli szokások szerint a településnevekben a c hangot a cz betűkapcsolat jelölte. Cseréljük ki ezeket c-re:

tux@madas:~/public_html/txt/mp$ sed "s/cz/c/g" ksh_hnk_1913.txt > ksh_hnk_1913.Txt
tux@madas:~/public_html/txt/mp$ 

A diff parancs soronként hasonlít össze:

tux@madas:~/public_html/txt/mp$ diff ksh_hnk_1913.txt ksh_hnk_1913.Txt 
…
12515c12515
< baczúr
---
> bacúr
12519,12520c12519,12520
< szászpelsőcz
< garamberzencze
---
> szászpelsőc
> garamberzence
…
tux@madas:~/public_html/txt/mp$ 

Eltérés esetén láthatjuk, hogy mely sorokat érinti az, illetve mit tartalmaz a két állomány ezekben a sorokban. Érdemes megfigyelni, hogy a kimenetből az is kiderül: egy vagy több egymást követő sor különbözik. (Általában is elmondható, hogy a diff parancs igen szofisztikáltan dolgozik: felismeri például azokat az eseteket is, amikor az egyik állományban többletsorok vannak a másikhoz képest; ezeken túlmenően tucatnyi opcióval finomítható a működése.)

A diff parancs eredménye is kiszalad a képernyőről. Ha szeretnénk a kimenetet lapozgatni, átadhatjuk azt a less parancsnak:

tux@madas:~/public_html/txt/mp$ diff ksh_hnk_1913.txt ksh_hnk_1913.Txt | less
…
7c7
< makrancz
---
> makranc
16,17c16,17
< alsóláncz
< felsőláncz
---
> alsólánc
> felsőlánc
…

A parancs –nyilván nem ok nélkül– a man parancs esetén látottakhoz hasonló mozgást tesz lehetővé a szövegben, illetve most is a q billentyűvel fejezhetjük be a használatát.

Említsük meg ehelyütt a cmp parancsot is: ez bináris állományok összehasonlításra való (nem soronként, hanem byte-onként veti össze az állományok tartalmát):

tux@madas:~/public_html/txt/mp$ cmp ksh_hnk_1913.txt ksh_hnk_1913.Txt
ksh_hnk_1913.txt ksh_hnk_1913.Txt eltér: byte: 16, sor: 2
tux@madas:~/public_html/txt/mp$ 

Az ls parancs a -t kapcsolóval az állományokat (módosítási) időbélyegük szerint rendezve írja ki (a lista elején a legfrissebben változottak állnak). Ezt kihasználva a head parancs segítségével láthatjuk, mit szerkesztettünk legutóbb:

tux@madas:~/public_html/txt/mp$ ls -alt | head
összesen 1704
-rw-r----- 1 tux www-data   1278 nov    4 16:00 ppv.txt
-rw-r----- 1 tux www-data    904 nov    4 16:00 ppw.txt
-rw-r----- 1 tux www-data    935 nov    4 16:00 ppr.txt
-rw-rw-r-- 1 tux tux        1005 nov    4 16:00 ppu.txt
-rw-r----- 1 tux www-data    995 nov    4 16:00 ppm.txt
-rw-r----- 1 tux www-data   2371 nov    4 16:00 ppp.txt
drwxr-x--- 2 tux www-data   4096 nov    4 16:00 .
-rw-rw-r-- 1 tux tux        2867 nov    4 16:00 ppu30.txT
-rw-rw-r-- 1 tux tux      136419 nov    4 12:22 ksh_hnk_1913.Txt
tux@madas:~/public_html/txt/mp$ 

Elsőre csak történeti érdekességnek tűnik a pr parancs: ez eredetileg a korabeli sornyomtatók számára formázta a bemenetként kapott sorokat. Ennek keretében azonban máig hasznos funkciókat valósítottak meg vele: így például hasábokra tudja tördelni a sorokat.

Néhány leckével ezelőtt az ls parancs kimenete 11 oszlopban jelent meg (és a szerző képernyőjén nem is fért el a megfelelő területen). Ehelyett láthattuk volna a következőt:

tux@madas:~/public_html/txt/mp$ ls | pr -6


2018-11-04 16:25                                                1. oldal


1b1bff.html pp151.txT	ppp20.txT   ppr06.txT	ppu10.txT   ppv.txt
1b1bff.txt  pp152.txT	ppp21.txT   ppr08.txT	ppu12.txT   ppv.txT
1.html	    pp160.txT	ppp25.txT   ppr10.txT	ppu14.txT   ppw00.txT
…

Ha valamiért úgy célszerűbb, rendezhetünk soronként is (-a), illetve elhagyhatjuk a nyomtatáshoz kialakított, számunkra fölösleges sorokat (-t):

tux@madas:~/public_html/txt/mp$ ls | pr -6at
1b1bff.html 1b1bff.txt	1.html	    20010224.tx 2.html	    4.html
5.html	    6.html	foot	    head	itiiee.txt  itiitr.txt
itv_html.ht itv_html.tx ksh_hnk_191 ksh_hnk_191 ksh_hnk_191 ksh_hnk_191
miu-1012.py miu-1019a.p miu-1019bb. miu-1019b.p miu-1026.py pfppt.txT
pp150.txT   pp151.txT	pp152.txT   pp160.txT	pp161.txT   pp162.txT
pp170.txT   pp171.txT	pp172.txT   pp181.txT	ppbg.txT    ppbq.txT
ppd.txT	    pp.html	pph.txT	    ppm.txt	ppm.txT	    ppp01.txT
ppp02.txT   ppp10.txT	ppp11.txT   ppp12.txT	ppp13.txT   ppp14.txT
…

Lássunk végül még egy példát arra, hogy egy eredetileg más célra tervezett parancs hogyan segítheti az adekvát eljárást nem ismerő felhasználót.

A du parancs eredendően a könyvtárak (-a opcióval pedig az állományok) helyfoglalását írná ki. De mivel ehhez bejárja az aktuális könyvtár alkönyvtárait is, a csővezetékbe épített szűrő segítségével kiírathatjuk vele a keresett állományokat is:

tux@madas:~$ cd ~
tux@madas:~$ du -a | grep ppke
20	./ownCloud/ppke
tux@madas:~$ 

(A hazatéréshez cd ~ helyett a cd parancs önmagában is elég lett volna.)