Állományok rendezése
Állományok rendezésére a standard Unixban egyetlen, ámde igen erőteljes parancs áll rendelkezésre, a sort. Működése kitűnően alkalmas a szabványos Unix szűrési mechanizmus ismertetésére is. Alapvető szintaktikus formája a következő (a részletes opcióleírást lásd a Minimanuál c. fejezetben):
sort [
opciók] [bemenet]Ha bemenet nincs megadva, a standard inputot olvassa és rendezi (ezt explicit módon is megadhatjuk, a - karakterrel). A kimenet alapértelmezés szerint a standard output, a -o kimenet opcióval lehet egy fájlba irányítani a rendezés eredményét. (Érdemes vigyáznunk arra, hogy ha a -o opció megadása nélkül, a sort bemenetének és kimenetének ugyanaz a fájlt adjuk meg, akkor a rendezés tönkreteszi azt; ilyen esetben a -o opció használata kötelező.)
Alapértelmezésben a sort parancs soronként, ASCII karakterérték szerint, növekvő sorrendben, a teljes beolvasott sorokat összehasonlítva rendezi a bemenetet. A -r opció hatására a rendezés sorrendje fordítható meg, a -n opció hatására pedig nem ASCII karakterértékként, hanem számként hasonlítja össze a beolvasott sorokat. (Nemcsak egész, hanem előjeles tizedespontos számokat is tud a sort rendezni.) Például a
ps | sort -n
parancs hatására a futó folyamatokat a processzazonosítók szerintve listázhatjuk ki.
Karakter szerinti rendezésnél fontos lehet a -d opció, ennek alkalmazásával úgynevezett szótári rendezést hajtathatunk végre, ekkor csak a betűk, számjegyek, valamint a szóköz és tabulátor karakterek játszanak a rendezésben. A -f opció hatására a kis- és nagybetűs karaktereket egyformán kezeli a sort, azaz esetérzéketlen rendezést érhetünk el. Meglepően hasznos lehet a -M opció, ennek hatására az összehasonlított mező első három karakterét angol hónapnevek rövidítéseként kezeli a sort, és eszerint rendez (érvénytelen < JAN < FEB < ... < DEC sorrendben).
Eddig nem említettük a sort egyik legfontosabb erényét, miszerint nemcsak a teljes sort összehasonlítva rendezhetjük a bemenetet, hanem azon belül egyes mezőket rendezési kulcsként megadva, kulcsonként, méghozzá több kulcs szerint is. Alapértelmezés szerint a bemenet mezői a szokásos shell értelmezés szerinti önálló, tehát szóköz és tabulátor karakterekkel megadott szavak, de a -tc opcióval tetszőleges más mezőhatároló karaktert is kijelölhetünk.
A rendezési kulcsokat a +m[.n] -p[.q] szintaxissal adhatjuk meg; a + jellel kezdődő opció mondja meg, hogy a rendezési kulcs hol kezdődik, a - karakterrel megadott opció pedig a mező végét. m.n az m-edik mező n-edik karakterét adja meg (a mezőket és karaktereket a sort 0-tól számozza!). A mezőn belüli karaktermegadás elhagyható, ilyenkor értelemszerűen a kulcskezdő mező első, illetve a kulcszáró mező utolsó karakterét jelenti. Hogy kicsit világosabbá tegyük:
sort -n -t: +2 -3 /etc/passwd
hatására a passwd fájl tartalmát a harmadik mező numerikus értéke szerint fogja rendezni, a mezőket pedig a ':' karakter fogja határolni. Más szóval a felhasználói azonosítók értéke szerint rendezve íratjuk ki a fájlt. Ne felejtsük, hogy a sort parancs a mezőket nullától számozza, fő a változatosság alapon...
sort -n -t: +3 -4 -n +2 -3 -o /etc/passwd /etc/passwd
hatására először a password fájl negyedik mezője (felhasználói csoportazonosító) alapján rendez, ha két sor ennek alapján azonos, akkor másodlagos kulcsként a harmadik mező, azaz a felhasználói azonosító alapján rendez - mindkét mező tartalmát numerikus értékként kezelve. A rendezett fájlt visszaírja a /etc/passwd fájlba. Következő példánkban a
sort -n +2.4 my_data
parancs hatására a my_data nevű fájlt rendezzük, a rendezési kulcs pedig a harmadik mező ötödik karakterétől a sor végéig tart. Végül utolsó példánkban olyan adatokat rendezünk sorba, ahol a sorok elején az angol megadás szerinti dátumokat (pl. Aug 23, 1995) várunk:
sort -n +2 -3 -M +0 -1 -n +1 -2
Végül még két fontos opciót említünk meg: a -m hatására két előzetesen már rendezett fájlt fésül össze egybe, a -u pedig a rendezésnél azonosnak talált sorokból csak egyet ír a kimenetre. (Utóbbi esetben érdemes vigyázni, ha ugyanis nem a teljes sor szerint rendezünk, akkor a rendezési kulcs szerinti azonosság nem jelenti azt, hogy a két sor azonos is!)