Unix-opas, luku 5 Muita toimintoja ja sovelluksia Unix-koneissa:

Putkitus ja filtterit

Putkitus

Yhden komennon tulostuksen voi ohjata suoraan toisen komennon lähtötiedoiksi. Tämä tietysti saataisiin aikaan ohjaamalla ensimmäisen komennon tulostus tiedostoon ja sitten käskemällä toisen komennon lukea kyseisestä tiedostosta:

komento1 >aputiedosto
komento2 <aputiedosto

jonka jälkeen aputiedoston voisi hävittää. Paljon mukavampaa on kuitenkin käyttää putkitusta:

komento1 | komento2

Tämä merkitsee, että komento1:n tulostus ei tule päätteelle vaan menee suoraan syöttötiedoiksi komento2:lle. Tällöin siis tilanne on, hienosti sanottuna, sellainen, että järjestelmä suorittaa komento1:n ja komento2:n kahtena prosessina siten, että ensin mainitun stdout on jälkimmäisen stdin.

Putkituksen merkki on siis |, joka näkyy laitteen mukaan pystyviivana (joskus katkonaisena pystyviivana) tai pienenä ö-kirjaimena (ks. skandinaavisista merkeistä kertovaa kohtaa).

Hyvin tavallista ja suositeltavaa on käyttää putkitusta jonkin komennon tai ohjelman tulostuksen sivuttamiseen more-komennon avulla. Jos sinulla esimerkiksi on paljon tiedostoja, niin komennon ls -l tulostus ei mahdu yhdelle ruudulliselle. Koska ls-komento ei jaa tulostusta kuvaruudullisiin, asia kannattaa hoitaa seuraavaan tapaan:

ls -l | more

Tämä perustuu siihen more-komennon, kuten usean muunkin komennon, piirteeseen, että jos komennossa ei anneta argumenttia, se lukee standardisyöttövirrasta. Oletusarvotilanteessa, jossa kyseinen virta tulee näppäimistöltä, siinä ei juuri ole järkeä, mutta putken käytön takia tässä tapauksessa standardisyöttövirrasta lukeminen merkitseekin komennon ls -l tulostuksen lukemista.

Putkitusta voi jatkaa esim. niin, että toisen komennon tulosteet menevät edelleen syötteiksi kolmannelle:

komento1 | komento2 | komento3

Filtterit

Usein Unix-slangissa kutsutaan filtteriksi sellaista komentoa tai ohjelmaa, joka lukee syötteensä standardisyöttövirrasta ja kirjoittaa tulosteensa standarditulostusvirtaan.

Filtterien vastakohtana ovat sellaiset komennot ja ohjelmat, joille ilmoitetaan syöttö- ja tulostustiedosto käynnistyskomennossa argumenteilla. Toisaalta hyvin yleisesti tällöin oletusarvona (eli toimintatapana silloin, kun tiedostoja ei ilmoiteta) on se, että syöttötiedostona on standardisyöttövirta ja tulostustiedostona standarditulostusvirta. Sellaisessa tapauksessa komentoa tai ohjelmaa voi käyttää filtterin tapaan, vaikka se ei ole filtteri sanan suppeassa merkityksessä.

Esimerkki. Komento colrm (jota jäljempänä käytetään esimerkkinä) on tyypillinen filtteri: se poistaa syöttötietoriveiltä tietoja, ja se lukee syöttötiedot standardisyöttövirrasta. Kyseiselle komennolle ei voi antaa syöttötiedoston nimeä argumenttina. Sen sijaan se voidaan ohjata lukemaan standardisyöttövirran halutusta tiedostosta seuraavaan tapaan:

colrm 50 <foobar
Sama koskee tulostusta, esim.
colrm 50 <foobar >foobar2
Jos komennolle voidaan antaa syöttötiedoston nimi argumenttina ja jos toisaalta oletusarvona on, että syöttötiedostona on standardisyöttövirta, voimme kirjoittaa yhtä hyvin
more foo
kuin
more <foo
mutta jos kyseessä on filtteri sanan suppeassa merkityksessä, vain jälkimmäinen vaihtoehto toimii.

Se, onko kyseessä filtteri vai ei, ilmenee kunkin komennon ja ohjelman kuvauksesta, esim. man-sivulta.

Nimi filtteri voi olla varsin harhaanjohtava. Sehän johtuu englannin sanasta filter, jonka normaali suomenkielinen vastine on suodatin (tai suodin) Yleiskielessä, ja myös yleensä tekniikan kielessä, suodatin tarkoittaa jotakin laitetta tms., joka päästää lävitseen vain osan siihen tulevasta aineesta, energiasta tai informaatiosta, esim. vain nesteen mutta ei kiinteitä aineita. Tämän käsitteen alaan esim. edellä mainittu colrm-komento sopii hyvin, samoin grep-komennot, jotka "päästävät lävitseen" vain osan "niihin tulevista" riveistä. Mutta yleisesti Unixissa filtteri ei suinkaan aina ole tietoa suodattava vaan se voi myös muokata tietoja eri tavoin tai käyttää syöttötietoja vain lähtöarvoina laskennalle. Filtterin tulostusvirta voi aivan hyvin olla laajempi kuin syöttövirta.