Sådan bruges Pipes på Linux

Brug Linux-pipes til at koreografere, hvordan kommandolinjeværktøjer samarbejder. Forenkle komplekse processer og øg din produktivitet ved at udnytte en samling af selvstændige kommandoer og gøre dem til et målbevidst team. Vi viser dig hvordan.

Rør er overalt

Pipes er en af ​​de mest nyttige kommandolinjefunktioner, som Linux og Unix-lignende operativsystemer har. Rør bruges på utallige måder. Se på en hvilken som helst Linux-kommandolinjeartikel – på et hvilket som helst websted, ikke kun vores – og du vil se, at rør dukker op oftere end ikke. Jeg gennemgik nogle af How-To Geeks Linux-artikler, og pipes bruges i dem alle, på den ene eller den anden måde.

Linux-pipes giver dig mulighed for at udføre handlinger, der ikke understøttes direkte af boksen skal. Men fordi Linux-designfilosofien er at have mange små hjælpeprogrammer, der udfører deres dedikeret funktion meget godt, og uden unødvendig funktionalitet – “gør én ting og gør det godt”-mantraet – kan du lodde rækker af kommandoer sammen med rør, så outputtet af en kommando bliver input fra en anden. Hver kommando, du sender ind, bringer sit unikke talent til holdet, og snart opdager du, at du har samlet et vinderhold.

Et simpelt eksempel

Antag, at vi har en mappe fuld af mange forskellige filtyper. Vi vil gerne vide, hvor mange filer af en bestemt type der er i den mappe. Der er andre måder at gøre dette på, men formålet med denne øvelse er at introducere rør, så vi vil gøre det med rør.

Vi kan nemt få en liste over filerne ved hjælp af ls:

ls

For at adskille filtypen af ​​interesse, bruger vi grep. Vi ønsker at finde filer, der har ordet “side” i deres filnavn eller filtypenavn.

Vi vil bruge shell-specialtegn “|” at overføre output fra ls til grep.

ls | grep "page"

ls -l |  grep

grep udskriver linjer, der matche dets søgemønster. Så dette giver os en liste, der kun indeholder “.page”-filer.

Selv dette trivielle eksempel viser funktionaliteten af ​​rør. Outputtet fra ls blev ikke sendt til terminalvinduet. Det blev sendt til grep som data for grep-kommandoen at arbejde med. Det output, vi ser, kommer fra grep, som er den sidste kommando i denne kæde.

  Sådan installeres Arc Theme For Thunderbird på Linux

Udvidelse af vores kæde

Lad os begynde at udvide vores kæde af kommandoer. Vi kan tælle “.page”-filerne ved at tilføje wc-kommandoen. Vi bruger muligheden -l (linjeantal) med wc. Bemærk, at vi også har tilføjet muligheden -l (langt format) til ls . Vi vil bruge denne snart.

ls - | grep "page" | wc -l

ls - |  grep

grep er ikke længere den sidste kommando i kæden, så vi kan ikke se dens output. Outputtet fra grep føres ind i wc-kommandoen. Udgangen vi ser i terminalvinduet er fra wc. wc rapporterer, at der er 69 “.page”-filer i mappen.

Lad os udvide tingene igen. Vi fjerner wc-kommandoen fra kommandolinjen og erstatter den med awk. Der er ni kolonner i output fra ls med muligheden -l (langt format). Vi vil bruge awk til udskrive kolonner fem, tre og ni. Disse er størrelsen, ejeren og navnet på filen.

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

Vi får en liste over disse kolonner for hver af de matchende filer.

Vi sender nu det output gennem sorteringskommandoen. Vi bruger muligheden -n (numerisk) til at lade sortere vide, at den første kolonne skal være behandles som tal.

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

Outputtet er nu sorteret i filstørrelsesrækkefølge med vores tilpassede udvalg af tre kolonner.

Tilføjelse af endnu en kommando

Vi slutter af med at tilføje halekommandoen. Vi vil fortælle det til en liste over sidste fem linjers output kun.

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

Det betyder, at vores kommando oversættes til noget som “vis mig de fem største “.page”-filer i denne mappe, sorteret efter størrelse.” Selvfølgelig er der ingen kommando til at opnå det, men ved at bruge rør har vi skabt vores eget. Vi kunne tilføje denne – eller en hvilken som helst anden lang kommando – som et alias eller en shell-funktion for at gemme al indtastningen.

Her er outputtet:

Vi kunne vende størrelsesrækkefølgen ved at tilføje -r (omvendt) mulighed til sorteringskommandoen og bruge hoved i stedet for hale til at vælge linjerne fra toppen af ​​outputtet.

Denne gang er de fem største “.page”-filer opført fra største til mindste:

Nogle nyere eksempler

Her er to interessante eksempler fra de seneste How-To-nørdeartikler.

Nogle kommandoer, såsom xargscommand, er designet at få input til dem. Her er en måde, vi kan få wc til at tælle ord, tegn og linjer i flere filer, ved at pibe ls ind i xargs, som derefter sender listen over filnavne til wc, som om de var blevet videregivet til wc som kommandolinjeparametre.

ls *.page | xargs wc

Det samlede antal ord, tegn og linjer er angivet nederst i terminalvinduet.

  Sådan får du størrelsen på en fil eller mappe i Linux

Her er en måde at få en sorteret liste over de unikke filtypenavne i den aktuelle mappe med en optælling af hver type.

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

Der sker meget her.

ls: Viser filerne i mappen
rev: Vender teksten om i filnavnene.
skære: Klipper snoren ved den første forekomst af den angivne afgrænsning “”. Tekst efter dette kasseres.
rev: Vender den resterende tekst, som er filtypenavnet.
sorter: Sorterer listen alfabetisk.
uniq: Tæller antallet af hver unik post på listen.

Outputtet viser listen over filtypenavne, sorteret alfabetisk med en optælling af hver unik type.

Navngivne Pipes

Der er en anden type rør tilgængelig for os, kaldet navngivne rør. Pibene i de foregående eksempler er oprettet on-the-fly af shellen, når den behandler kommandolinjen. Rørene skabes, bruges og kasseres derefter. De er forbigående og efterlader ingen spor af sig selv. De eksisterer kun, så længe kommandoen, der bruger dem, kører.

Navngivne rør vises som vedvarende objekter i filsystemet, så du kan se dem ved hjælp af ls. De er vedholdende, fordi de vil overleve en genstart af computeren – selvom alle ulæste data i dem på det tidspunkt vil blive kasseret.

Navngivne rør blev brugt meget på én gang for at give forskellige processer mulighed for at sende og modtage data, men jeg har ikke set dem brugt på den måde i lang tid. Der er uden tvivl folk derude, der stadig bruger dem med stor effekt, men jeg har ikke stødt på nogen for nylig. Men for fuldstændighedens skyld, eller bare for at tilfredsstille din nysgerrighed, se her, hvordan du kan bruge dem.

Navngivne rør oprettes med kommandoen mkfifo. Denne kommando vil oprette et navngivet rør kaldet “geek-pipe” i den aktuelle mappe.

mkfifo geek-pipe

Vi kan se detaljerne i det navngivne rør, hvis vi bruger kommandoen ls med -l (langt format) mulighed:

ls -l geek-pipe

Det første tegn i listen er et “p”, hvilket betyder, at det er et rør. Hvis det var et “d”, ville det betyde, at filsystemobjektet er en mappe, og en bindestreg “-” ville betyde, at det er en almindelig fil.

Brug af det navngivne rør

Lad os bruge vores pibe. De unavngivne rør, vi brugte i vores tidligere eksempler, sendte dataene straks fra den afsendende kommando til den modtagende kommando. Data sendt gennem et navngivet rør forbliver i røret, indtil det er læst. Dataene opbevares faktisk i hukommelsen, så størrelsen af ​​det navngivne rør vil ikke variere i ls-lister, om der er data i det eller ej.

  Sådan bruges og installeres FlatPak på Linux

Vi vil bruge to terminalvinduer til dette eksempel. Jeg bruger etiketten:

# Terminal-1

i ét terminalvindue og

# Terminal-2

i den anden, så du kan skelne mellem dem. Hashen “#” fortæller skallen, at det, der følger, er en kommentar, og at den skal ignoreres.

Lad os tage hele vores tidligere eksempel og omdirigere det til det navngivne rør. Så vi bruger både unavngivne og navngivne rør i én kommando:

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

ls |  rev |  skære -d'.'  -f1 |  rev |  sortere |  uniq -c > geek-pipe i et terminalvindue” width=”646″ højde=”97″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Der ser ikke ud til at ske meget.  Du kan dog bemærke, at du ikke bliver returneret til kommandoprompten, så der sker noget.</p>
<p>I det andet terminalvindue skal du udsende denne kommando:</p>
<pre>cat < nørd- rør</pre>
<p><img loading=

Vi omdirigerer indholdet af det navngivne rør til kat, så den kat vil vise indholdet i det andet terminalvindue. Her er outputtet:

Og du vil se, at du er blevet returneret til kommandoprompten i det første terminalvindue.

Så hvad skete der lige.

Vi omdirigerede noget output til det navngivne rør.
Det første terminalvindue vendte ikke tilbage til kommandoprompten.
Dataene forblev i røret, indtil det blev læst fra røret i den anden terminal.
Vi blev returneret til kommandoprompten i det første terminalvindue.

Du tænker måske, at du kunne køre kommandoen i det første terminalvindue som en baggrundsopgave ved at tilføje et & til slutningen af ​​kommandoen. Og du ville have ret. I så fald ville vi være blevet returneret til kommandoprompten med det samme.

Pointen med ikke at bruge baggrundsbehandling var at fremhæve, at et navngivet rør er en blokeringsproces. At putte noget i et navngivet rør åbner kun den ene ende af røret. Den anden ende åbnes ikke, før læseprogrammet udtrækker dataene. Kernen suspenderer processen i det første terminalvindue, indtil dataene læses fra den anden ende af røret.

Rørenes magt

I dag er navngivne piber noget af en nyhed.

Almindelige gamle Linux-rør er på den anden side et af de mest nyttige værktøjer, du kan have i dit terminalvinduesværktøj. Linux-kommandolinjen begynder at blive levende for dig, og du får en helt ny power-up, når du kan orkestrere en samling kommandoer for at producere én sammenhængende forestilling.

Afskedstip: Det er bedst at skrive dine pipe-kommandoer ved at tilføje en kommando ad gangen og få den del til at virke, og derefter indsætte den næste kommando.