Hvordan bruke Pipes på Linux

Bruk Linux-pipes til å koreografere hvordan kommandolinjeverktøy samarbeider. Forenkle komplekse prosesser og øk produktiviteten din ved å utnytte en samling frittstående kommandoer og gjøre dem om til et målrettet team. Vi viser deg hvordan.

Rør er overalt

Pipes er en av de mest nyttige kommandolinjefunksjonene som Linux og Unix-lignende operativsystemer har. Rør brukes på utallige måter. Se på hvilken som helst Linux-kommandolinjeartikkel – på et hvilket som helst nettsted, ikke bare vårt – og du vil se at rør dukker opp oftere enn ikke. Jeg gjennomgikk noen av How-To Geeks Linux-artikler, og pipes brukes i dem alle, på en eller annen måte.

Linux-rør lar deg utføre handlinger som ikke støttes direkte av boksen skall. Men fordi Linux-designfilosofien er å ha mange små verktøy som utfører deres dedikert funksjon veldig bra, og uten unødvendig funksjonalitet – «gjør én ting og gjør det bra»-mantraet – kan du lodde strenger av kommandoer sammen med rør slik at utdataene fra en kommando blir input til en annen. Hver kommando du sender inn bringer sitt unike talent til laget, og snart finner du ut at du har satt sammen et vinnerlag.

Et enkelt eksempel

Anta at vi har en katalog full av mange forskjellige filtyper. Vi ønsker å vite hvor mange filer av en bestemt type som er i den katalogen. Det finnes andre måter å gjøre dette på, men formålet med denne øvelsen er å introdusere rør, så vi skal gjøre det med rør.

Vi kan enkelt få en liste over filene ved å bruke ls:

ls

For å skille ut filtypen av interesse, bruker vi grep. Vi ønsker å finne filer som har ordet «side» i filnavnet eller filtypen.

Vi vil bruke skall-spesialtegnet «|» å overføre utdata fra ls til grep.

ls | grep "page"

ls -l |  grep

grep skriver ut linjer som samsvarer med søkemønsteret. Så dette gir oss en liste som bare inneholder «.page»-filer.

Selv dette trivielle eksemplet viser funksjonaliteten til rør. Utdataene fra ls ble ikke sendt til terminalvinduet. Den ble sendt til grep som data for grep-kommandoen å jobbe med. Utdataene vi ser kommer fra grep, som er den siste kommandoen i denne kjeden.

Forlenger vår kjede

La oss begynne å utvide kjeden vår av kommandoer. Vi kan telle «.page»-filene ved å legge til wc-kommandoen. Vi bruker alternativet -l (linjeantall) med wc. Merk at vi også har lagt til alternativet -l (langt format) til ls . Vi skal bruke denne snart.

ls - | grep "page" | wc -l

ls - |  grep

grep er ikke lenger den siste kommandoen i kjeden, så vi ser ikke utgangen. Utdataene fra grep mates inn i wc-kommandoen. Utgangen vi ser i terminalvinduet er fra wc. wc rapporterer at det er 69 «.page»-filer i katalogen.

  Hvordan bruke Shazam på Linux-skrivebordet med SongRec

La oss utvide ting igjen. Vi tar wc-kommandoen fra kommandolinjen og erstatter den med awk. Det er ni kolonner i utdata fra ls med alternativet -l (langt format). Vi bruker awk til skrive ut kolonner fem, tre og ni. Dette er størrelsen, eieren og navnet på filen.

ls -l | grep "page" | awk '{print $5 " " $3 " " $9}'

Vi får en liste over disse kolonnene, for hver av de samsvarende filene.

Vi sender nå utdataene gjennom sorteringskommandoen. Vi bruker alternativet -n (numerisk) for å fortelle sorteringen at den første kolonnen skal være behandlet som tall.

ls -l | grep "page" | awk '{print $5 " " $3 " " $9}' | sort -n

Utdataene er nå sortert i filstørrelsesrekkefølge, med vårt tilpassede utvalg av tre kolonner.

Legger til en annen kommando

Vi avslutter med å legge til halekommandoen. Vi vil fortelle det å liste opp siste fem linjene med utdata kun.

ls -l | grep "page" | awk '{print $5 " " $3 " " $9}' | sort -n | tail -5

Dette betyr at kommandoen vår oversettes til noe sånt som «vis meg de fem største «.page»-filene i denne katalogen, sortert etter størrelse. Selvfølgelig er det ingen kommando for å oppnå det, men ved å bruke rør har vi laget vår egen. Vi kan legge til denne – eller en hvilken som helst annen lang kommando – som et alias eller skallfunksjon for å lagre all skrivingen.

Her er utgangen:

Vi kan snu størrelsesrekkefølgen ved å legge til -r (revers)-alternativet til sorteringskommandoen, og bruke hode i stedet for hale for å velge linjene fra toppen av utgangen.

Denne gangen er de fem største «.page»-filene oppført fra størst til minste:

Noen nyere eksempler

Her er to interessante eksempler fra nylige How-To-nerdeartikler.

Noen kommandoer, for eksempel xargs-kommandoen, er utformet å ha input i rør til dem. Her er en måte vi kan få wc til å telle ord, tegn og linjer i flere filer, ved å overføre ls til xargs som deretter mater listen over filnavn til wc som om de hadde blitt sendt til wc som kommandolinjeparametere.

ls *.page | xargs wc

Det totale antallet ord, tegn og linjer er oppført nederst i terminalvinduet.

  Hvordan installere Zettlr markdown-editoren på Linux

Her er en måte å få en sortert liste over de unike filtypene i gjeldende katalog, med en telling av hver type.

ls | rev | cut -d'.' -f1 | rev | sort | uniq -c

Det er mye som skjer her.

ls: Viser filene i katalogen
rev: Reverserer teksten i filnavnene.
skjære: Kutter snoren ved første gang det spesifiserte skilletegnet «». Tekst etter dette forkastes.
rev: Reverserer den gjenværende teksten, som er filtypen.
sorter: Sorterer listen alfabetisk.
uniq: Teller antallet av hver unik oppføring i listen.

Utdataene viser listen over filutvidelser, sortert alfabetisk med en telling av hver unike type.

Navnet Pipes

Det er en annen type rør tilgjengelig for oss, kalt navngitte rør. Pipene i de forrige eksemplene lages på farten av skallet når det behandler kommandolinjen. Rørene lages, brukes og kastes deretter. De er forbigående og etterlater ingen spor av seg selv. De eksisterer bare så lenge kommandoen som bruker dem kjører.

Navngitte rør vises som vedvarende objekter i filsystemet, slik at du kan se dem ved å bruke ls. De er vedvarende fordi de vil overleve en omstart av datamaskinen – selv om alle uleste data i dem på det tidspunktet vil bli forkastet.

Navngitte rør ble brukt mye på en gang for å tillate forskjellige prosesser å sende og motta data, men jeg har ikke sett dem brukt på den måten på lenge. Uten tvil er det folk der ute som fortsatt bruker dem med stor effekt, men jeg har ikke møtt noen i det siste. Men for fullstendighetens skyld, eller bare for å tilfredsstille din nysgjerrighet, er det her hvordan du kan bruke dem.

Navngitte rør opprettes med mkfifo-kommandoen. Denne kommandoen vil opprette et navngitt rør kalt «geek-pipe» i gjeldende katalog.

mkfifo geek-pipe

Vi kan se detaljene til det navngitte røret hvis vi bruker ls-kommandoen med alternativet -l (langt format):

ls -l geek-pipe

Det første tegnet i oppføringen er en «p», som betyr at det er en pipe. Hvis det var en «d», ville det bety at filsystemobjektet er en katalog, og en bindestrek «-» ville bety at det er en vanlig fil.

Bruker det navngitte røret

La oss bruke pipen vår. De navnløse rørene vi brukte i våre tidligere eksempler sendte dataene umiddelbart fra sendekommandoen til mottakskommandoen. Data sendt gjennom et navngitt rør vil forbli i røret til det blir lest. Dataene holdes faktisk i minnet, så størrelsen på det navngitte røret vil ikke variere i ls-oppføringer om det er data i det eller ikke.

  Hvordan spille Trine 2 på Linux

Vi skal bruke to terminalvinduer for dette eksemplet. Jeg bruker etiketten:

# Terminal-1

i ett terminalvindu og

# Terminal-2

i den andre, slik at du kan skille mellom dem. Hash-koden «#» forteller skallet at det som følger er en kommentar, og å ignorere det.

La oss ta hele vårt forrige eksempel og omdirigere det til det navngitte røret. Så vi bruker både navngitte og navngitte rør i én kommando:

ls | rev | cut -d'.' -f1 | rev | sort | uniq -c > geek-pipe

ls |  rev |  cut -d'.'  -f1 |  rev |  sortere |  uniq -c > geek-pipe i et terminalvindu” width=”646″ height=”97″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Det ser ikke ut til å skje mye.  Du kan imidlertid legge merke til at du ikke kommer tilbake til ledeteksten, så noe er på gang.</p>
<p>I det andre terminalvinduet, utfør denne kommandoen:</p>
<pre>cat < geek- pipe</pre>
<p><img loading=

Vi omdirigerer innholdet i det navngitte røret til katt, slik at katten vil vise innholdet i det andre terminalvinduet. Her er utgangen:

Og du vil se at du har blitt returnert til ledeteksten i det første terminalvinduet.

Så, hva skjedde.

Vi omdirigerte noe utdata til det navngitte røret.
Det første terminalvinduet returnerte ikke til ledeteksten.
Dataene ble værende i røret til det ble lest fra røret i den andre terminalen.
Vi ble returnert til ledeteksten i det første terminalvinduet.

Du tenker kanskje at du kan kjøre kommandoen i det første terminalvinduet som en bakgrunnsoppgave ved å legge til en & på slutten av kommandoen. Og du vil ha rett. I så fall ville vi ha blitt returnert til ledeteksten umiddelbart.

Poenget med å ikke bruke bakgrunnsbehandling var å fremheve at et navngitt rør er en blokkeringsprosess. Å sette noe inn i et navngitt rør åpner bare den ene enden av røret. Den andre enden åpnes ikke før leseprogrammet trekker ut dataene. Kjernen suspenderer prosessen i det første terminalvinduet til dataene leses fra den andre enden av røret.

Kraften til rør

I dag er navngitte piper noe av en nyhet.

Vanlige gamle Linux-rør, på den annen side, er et av de mest nyttige verktøyene du kan ha i terminalvinduets verktøysett. Linux-kommandolinjen begynner å bli levende for deg, og du får en helt ny kraft når du kan orkestrere en samling kommandoer for å produsere én sammenhengende forestilling.

Avskjedstips: Det er best å skrive kommandoene dine ved å legge til én kommando om gangen og få den delen til å fungere, og deretter legge inn neste kommando.