Állományok összehasonlítása
Különböző szempontból hasonlítanak össze állományokat a comm, a cmp és a diff parancsok.
A comm három oszlopban írja ki két állomány összehasonlításának eredményét. Az első oszlopban csak azok a sorok szerepelnek, amelyek csak az első, a másodikban azok amelyek csak a második, végül a harmadikban azok amelyek mindkét állományban előfordulnak. Ha az egyik állománynév helyén - jelet írunk, akkor a standard inputról várja az egyik összehasonlítandó tartalmat. Így interaktívan használható arra is, hogy megnézzük bizonyos sorok meglétét egy állományban.
Egyik fájlunk legyen a pár oldallal odébb definiált semmi, s valami egy másik állomány.
$ cat valami
*****
Ez valami
***** *****
alma
korte
repa
retek
mogyoro
narancs
Ha a comm paranccsal összehasonlítjuk semmit és valamit az eredmény csak egy közös sort fog mutatni, az első, csupa csillagból álló sort. Értelmesen csak akkor tud a comm dolgozni, ha az állományok sorai "ábécé"-be rendezettek.
A cmp parancs két állomány összehasonlítására szolgál, itt is szerepelhet az egyik állomány helyén - karakter, a standard inputot jelölve. Alapértelmezés szerint azonos állományok esetén nem ír ki semmit, eltérés esetén jelzi az eltérés sor- és bájtszámát. Felismeri, ha az egyik állomány a másik kezdeti része. Nagy előnye, hogy a diff paranccsal ellentétben bináris fájlok összehasonlítására is alkalmas.
A diff program kilistázza a két összehasonlított állomány eltérő részeit, ----- karakterekkel jelölve az egyes állományokban eltérő részeket. A diff igazi használhatósága azonban abban rejlik, hogy nemcsak azt mondja meg, hogy a két állomány hol tér el egymástól, hanem azt is, hogy hogyan lehet az egyikből a másikat rekonstruálni. A produkált kimenetben olyan sorok is szerepelnek, amelyek az ed editor számára értelmezhető parancsok, és azt mondják meg, hogy mely ed parancsokkal lehet az egyik állományt a másikká konvertálni.
Az ed parancssorok után egymástól vonallal elválasztva jönnek az egyik illetve a másik állományban érintett sorok. A -e opció hatására csak a megfelelő ed parancssorok generálódnak, így lehetőség nyílik egyfajta primitív verziókövetési rendszer létrehozására. Vegyük példának azt az esetet, amikor egy állományt módosítva létrehozunk egy másik állományt, de ahelyett, hogy mindkettőt elmentenénk, csak az elsőt, illetve a két változat különbségét mentjük el.
Van még két állományunk a vers1 és vers2.
$ cat vers1
Elaludtak a fak
a levelek libegnek
az almok tudnak varni
az almok nem sietnek
$ cat vers2
Elaludtak a fak
a levelek libegnek
az almok tudnak varni
az almok nem sietnek
Tudjal te is almokra varni,
ahogy ok tudnak varni rad
Az eber csak igy nem csalja meg magat.
A kettő különbsége:
$ diff vers1 vers2
4a5,7
> Tudjal te is almokra varni,
> ahogy ok tudnak varni rad
> Az eber csak igy nem csalja meg magat.
$
Készítsük el a delta javítóállományt.
$ diff -e vers1 vers2 | tee delta
4a
Tudjal te is almokra varni,
ahogy ok tudnak varni rad
Az eber csak igy nem csalja meg magat.
.
$
A '4a5,7' ed parancs azt jelzi, hogy az eredeti fájl negyedik sora után kell beszúrni a másik fájl 5-7 sorait.
Ha most az alábbi parancssorozatot gépeljük be, akkor az eredeti szöveg és a különbség alapján visszakaphatjuk a frissebb változatot:
$ (cat delta; echo '1,$p') | ed - vers1
Elaludtak a fak
a levelek libegnek
az almok tudnak varni
az almok nem sietnek
Tudjal te is almokra varni,
ahogy ok tudnak varni rad
Az eber csak igy nem csalja meg magat.
$
Mielőtt továbbmennénk, tegyünk két megjegyzést az előbbi parancssorhoz. A pipe-olt utasítások ütemezését nem a shell, hanem a kernel végzi. Az echo parancs argumentuma itt az ed editor munkájának befejezését vezérli, az 1,$ az elsőtől az utolsó sorig jelöli ki a tartományt, a p pedig a print parancs.
A példában felhasználtuk a tee parancsot is. Ez a parancs "megcsapolja" az outputot, így a természetes outputon kívül keletkezik a delta állomány ugyanazzal a tartalommal, mint amit a képernyőn látunk.
Ugyanezen az elven működik egyébként a UNIX SCCS (Source Code Control System) forráskövető rendszere is.
A cmp és a diff egyaránt állítják a kimeneti változók értékét, mégpedig egységesen az alábbi szempont szerint: 0-ra, ha a két állomány egyezik, 1-re ha különböznek, és 2-re, ha akadály van a parancs végrehajtásában.
Nem életbevágóan fontos parancs, inkább csak a UNIX-ról alkotott kép kiszínezésére említjük meg a join parancsot, ami két állomány soraiból fűzi össze az outputját, úgy, hogy az összefűzés kulcsául választott mezők alapján az azonos tartalmú mezőket egyesíti. A helyes működés feltétele, hogy a kulcsnak választott mező alapján az állomány lexikografikusan rendezett legyen. Megint csak példával segítjük a megértést:
$sort -n -t: +3 -4 /etc/passwd >pswd
$sort -n -t: +2 -3 /etc/group >grp
$join -t: -j1 4 -j2 3 -o1.1 1.4 2.1 pswd grp
Az első két sor értelme, hogy rendezze a nevezett állományok sorait, az első esetben a harmadik és negyedik, a második esetben a második és harmadik mező alapján. (A mezőhatározó karakter a kettőspont.) A harmadik sor azt mondja, hogy még mindig a kettőspont mezőelválasztóval dolgozva, az elsőként megadott állomány negyedik és a másodikként megadott állomány harmadik mezeje szerint ( -j1 4 -j2 3) párosítva a sorokat az output sorait az első állomány első és negyedik valamint a második állomány első mezeiből tegye össze ( -o1.1 1.4 2.1). Egyszerűbben szólva, az output sorai rendre a bejelentkezési névből, a csoport azonosítóból és a csoport névből fognak állni.