Putket antavat ohjelmien toimia yhteistyössä yhdistämällä yhden ohjelman ulostulon toisen ohjelman sisääntuloon. Käsitteellä "ulostulo" on tässä tarkka merkitys: ohjelma kirjoittaa sen standardiulostuloon C-ohjelmointikielen komentojen avulla. Näitä komentoja ovat "printf" ja vastaavat. Normaalisti ulostulo näkyy terminaalin ruudulla. "Sisääntulo" tarkoittaa standardisisääntuloa, joka tulee yleensä näppäimistöltä. Putket rakennetaan käyttämällä pystysuoraa palkkia ("|") putken symbolina.
Niinpä voit auttaa englanninkielistä Hortense-tätiäsi järjestelemään yksityistä kirjakokoelmaansa. Sinulla on "kirjat"-niminen tiedosto, joka sisältää hänen kirjansa, yksi kirja jokaisella rivillä, muodossa "kirjoittaja:kirja", jotenkin tähän malliin:
$ cat kirjat Carroll, Lewis:Through the Looking-Glass Shakespeare, William:Hamlet Bartlett, John:Familiar Quotations Mill, John Stuart:On Nature London, Jack:John Barleycorn Bunyan, John:Pilgrim's Progress, The Defoe, Daniel:Robinson Crusoe Mill, John Stuart:System of Logic, A Milton, John:Paradise Lost Johnson, Samuel:Lives of the Poets Shakespeare, William:Julius Caesar Mill, John Stuart:On Liberty Bunyan, John:Saved by Grace
Tämä on melko epäjärjestelmällistä, sillä ne eivät ole missään järkevässä järjestyksessä. Käytetäänpä komentoa "sort" järjestämään ne:
$ sort kirjat Bartlett, John:Familiar Quotations Bunyan, John:Pilgrim's Progress, The Bunyan, John:Saved by Grace Carroll, Lewis:Through the Looking-Glass Defoe, Daniel:Robinson Crusoe Johnson, Samuel:Lives of the Poets London, Jack:John Barleycorn Mill, John Stuart:On Liberty Mill, John Stuart:On Nature Mill, John Stuart:System of Logic, A Milton, John:Paradise Lost Shakespeare, William:Hamlet Shakespeare, William:Julius Caesar
Nyt tuloksena on siisti kirjoittajan mukaan järjestetty lista. Entäpä pelkästään kirjoittajien nimien listaaminen ilman kirjojen nimiä? Voit tehdä tämän komennolla "cut":
$ cut -d: -f1 kirjat Carroll, Lewis Shakespeare, William Bartlett, John Mill, John Stuart London, Jack Bunyan, John Defoe, Daniel Mill, John Stuart Milton, John Johnson, Samuel Shakespeare, William Mill, John Stuart Bunyan, John
Pieni selvitys tarvitaan. Valitsin "-d
" valitsi kaksoispisteen erottimeksi. Tämä käskee komennon "cut
" leikata jokainen rivi erottimen ilmestyessä. Jokaista rivin erillistä osaa kutsutaan kentäksi. Meidän formaatissamme kirjoittajan nimi näkyy ensimmäisenä kenttänä, joten meidän täytyy laittaa "1 -f" valitsimeen kertoaksemme komennolle "
cut"
mitä tahdomme nähdä tässä kentässä.
Mutta näet, että lista on taas järjestämättä. Putket apuun!
$ sort kirjat | cut -d: -f1 Bartlett, John Bunyan, John Bunyan, John Carroll, Lewis Defoe, Daniel Johnson, Samuel London, Jack Mill, John Stuart Mill, John Stuart Mill, John Stuart Milton, John Shakespeare, William Shakespeare, William
Hyvä! Olet ottanut aakkosjärjestyksessä kirjoitetun listan, joka on komennon "sort" ulostulo, ja syöttänyt sen sisääntulona komennolle "cut". Älä anna komennolle "cut" tiedostonimeä käytettäväksi, sillä tahdot sen käsittelevän tekstiä, joka on putkitettu ulos "sort"-komennosta.
Putket ovat niin yksinkertaisia - teksti virtaa putkea pitkin komennosta toiseen.
Entäpä jos tahtoisitkin järjestetyn listan kirjojen nimistä? Koska kirjojen nimet ovat toisessa kentässä, kokeillaan käyttää valitsinta "-f2"
"cut
" -komennossa valitsimen "-f1"
sijasta:
$ sort kirjat | cut -d: -f2 Familiar Quotations Pilgrim's Progress, The Saved by Grace Through the Looking-Glass Robinson Crusoe Lives of the Poets John Barleycorn On Liberty On Nature System of Logic, A Paradise Lost Hamlet Julius Caesar
Hups. Mitä tapahtui? Kun katsot putkea, sinun pitää katsoa vasemmalta oikealle. Tässä tapauksessa järjestimme ensimmäisen tiedoston ennen kirjojen nimien uuttamista. Niinpä se järjesti rivit velvollisuudentuntoisesti ensimmäisellä rivillä olevien kirjailijoiden nimien mukaan. Saadaksesi kirjojen nimet oikeaan järjestykseen, joudut järjestämään ne vasta niiden uuttamisen jälkeen:
$ cut -d: -f2 kirjat | sort Familiar Quotations Hamlet John Barleycorn Julius Caesar Lives of the Poets On Liberty On Nature Paradise Lost Pilgrim's Progress, The Robinson Crusoe Saved by Grace System of Logic, A Through the Looking-Glass
Paljon parempi. Tämä kaikki on hienoa, mutta ehkä olisit voinut tehdä nämä asiat taulukkolaskentaohjelmalla. Yksinkertaisempien tehtävien suhteen tämä on luultavasti totta. Mutta oleta, että täti Hortensen tapana on kysyä outoja kysymyksiä kokoelmastaan. Hän tahtoo esimerkiksi tietää, kuinka monta kirjaa hänellä on John-nimisiltä kirjailijoilta. Taulukkolaskentaohjelmalla tai muulla graafisella ohjelmalla voi olla vaikeuksia käsitellä kysymyksiä, joita ohjelman tekijät eivät odottaneet. Komentotulkki tarjoaa kuitenkin monia yksinkertaisia komentoja, jotka voidaan yhdistää ennennäkemättömillä tavoilla monimutkaisten tehtävien toteuttamiseksi.
Löytääksesi tietyn merkkijonon tekstiriviltä voit käyttää "grep"-komentoa. Huomaa, että yhdistäessäsi komentoja niiden täytyy olla oikeassa järjestyksessä. Et voi käyttää komentoa "grep" tiedostoon ensin, sillä se sopii otsikkoon "John Barleycorn" John-nimisten kirjoittajien lisäksi. Joten lisää se putken loppuun:
$ cut -d: -f1 kirjat | sort | grep "John" Bartlett, John Bunyan, John Bunyan, John Johnson, Samuel Mill, John Stuart Mill, John Stuart Mill, John Stuart Milton, John
Tämä vie meidät lähemmäs, mutta nyt et tahdo saada nimeä "Samuel Johnson" listalle ja suututtaa Hortense-tätiä. Usein työskennelläsi "grep"-komennolla joudut tarkentamaan sopivaa tekstiä täsmälleen siihen, mitä tarvitset. Komento grep tarjoaa "-w" -valitsimen, joka antaa sen sovittaa "John" ainoastaan kun "John" on kokonainen sana, ei sen ollessa osa sanaa "Johnson". Mutta ratkaisemme tämän ongelman lisäämällä pilkun ja välilyönnin sovitettavan merkkijonon eteen, jolloin se sopii ainoastaan Johnin ollessa etunimi:
$ cut -d: -f1 kirjat | sort | grep ", John" Bartlett, John Bunyan, John Bunyan, John Mill, John Stuart Mill, John Stuart Mill, John Stuart Milton, John
Tämä on parempi. Nyt joudut vain laskemaan yhteen kirjojen määrän jokaiselta kirjoittajalta. Pieni komento, jota kutsutaan nimellä "uniq
" toimii hyvin. Se poistaa samanlaiset rivit (niiden täytyy olla toisiaan seuraavia rivejä, joten varmista, että tekstisi on järjestetty ensin) ja valitsimen "-c" kanssa se tarjoaa myös laskee samanlaiset rivit:
$ cut -d: -f1 kirjat | sort | grep ", John" | uniq -c 1 Bartlett, John 2 Bunyan, John 3 Mill, John Stuart 1 Milton, John
Siinäpä se! Hyvin järjestetty lista Johneja ja heidän kirjojaan. Esimerkkimme on yksinkertainen homma ja voisit tehdä sen kynällä ja paperilla. Mutta tämä sama putki voisi käsitellä paljon suurempia tietomääriä - se ei välittäisi, vaikka täti Hortensella olisi satojatuhansia kirjoja navetassaan.
Järjestelmänvalvojat käyttävät tämän kaltaisia putkia usein käsitelläkseen verkko- ja sähköpostipalvelinten lokitiedostoja. Sellaiset tiedostot voivat venyä kymmeniin tai satoihin megatavuihin ja komentoputki voi olla nopea tapa luoda tilastoja ilman koko lokin lukemista.
Hyvä puoli putkien rakentamisessa on, että voit tehdä sen komento kerrallaan, nähden täsmälleen jokaisen vaikutuksen ulostuloon. Tämä voi auttaa sinua havaitsemaan koska tarvitset valitsinten muuttamista tai komentojen järjestyksen vaihtamista. Esimerkiksi laittaaksesi kirjoittajat järjestykseen kirjojen lukumäärän mukaan voit vain lisätä komennon "sort -nr"
edelliseen putkeen:
$ cut -d: -f1 kirjat | sort | grep ", John" | uniq -c | sort -nr 3 Mill, John Stuart 2 Bunyan, John 1 Milton, John 1 Bartlett, John
Kokeile!
There has been error in communication with Booktype server. Not sure right now where is the problem.
You should refresh this page.