Pipes gebruiken op Linux

Linux-terminal op een laptop
Fatmawati Achmad Zaenuri / Shutterstock.com

Gebruik Linux-buizen om te choreograferen hoe opdrachtregelhulpprogramma’s samenwerken. Vereenvoudig complexe processen en verhoog uw productiviteit door een verzameling zelfstandige opdrachten te benutten en er een vastberaden team van te maken. We laten je zien hoe.

Leidingen zijn overal

Pijpen zijn een van de handigste opdrachtregelfuncties die Linux- en Unix-achtige besturingssystemen hebben. Buizen worden op talloze manieren gebruikt. Bekijk een willekeurig Linux-artikel op de opdrachtregel – op elke website, niet alleen op de onze – en je zult zien dat pipes vaker wel dan niet verschijnen. Ik heb een aantal Linux-artikelen van How-To Geek bekeken en in al deze artikelen worden op de een of andere manier pijpen gebruikt.

Met Linux-leidingen kun je acties uitvoeren die niet standaard door de shell worden ondersteund. Maar omdat de Linux-ontwerpfilosofie is om veel kleine hulpprogramma’s te hebben die hun toegewijde functie heel goed uitvoeren, en zonder onnodige functionaliteit – de mantra ‘doe één ding en doe het goed’ – kun je reeksen commando’s samenvoegen met pijpen zodat de van het ene commando wordt de invoer van een ander. Elk commando dat je invoert, brengt zijn unieke talent naar het team, en al snel merk je dat je een winnend team hebt samengesteld.

Een eenvoudig voorbeeld

Stel dat we een directory hebben vol met veel verschillende soorten bestanden. We willen weten hoeveel bestanden van een bepaald type er in die directory staan. Er zijn andere manieren om dit te doen, maar het doel van deze oefening is om pijpen te introduceren, dus we gaan het doen met pijpen.

We kunnen gemakkelijk een lijst van de bestanden krijgen met ls:

ls

Verzameling als bestanden in een map, in een terminalvenster

Om het bestandstype van interesse te onderscheiden, gebruiken we grep. We willen bestanden vinden met het woord “pagina” in hun bestandsnaam of bestandsextensie.

We gebruiken het speciale shell-teken ‘|”Om de output van ls in grep.

ls | grep "page"

ls -l |  grep "pagina" in een terminalvenster

grep drukt lijnen af ​​die overeenkomen met het zoekpatroon. Dit geeft ons dus een lijst met alleen “.page” -bestanden.

lijst met paginabestanden in een terminalvenster

Zelfs dit triviale voorbeeld toont de functionaliteit van pijpen. De output van ls is niet naar het terminalvenster gestuurd. Het is verzonden naar grep als gegevens voor de grep commando om mee te werken. De output die we zien komt van grep, dat is het laatste commando in deze keten.

Onze keten verlengen

Laten we beginnen met het uitbreiden van onze reeks doorgesluisde opdrachten. We kunnen de “.page” -bestanden tellen door de wc opdracht. We zullen de -l (line count) optie met wc. Merk op dat we ook het -l (lang formaat) optie naar ls . We zullen dit binnenkort gebruiken.

ls - | grep "page" | wc -l

ls - |  grep "pagina" |  wc -l in een terminalvenster

grep is niet langer het laatste commando in de keten, dus we zien de uitvoer ervan niet. De output van grep wordt in de wc opdracht. De uitvoer die we in het terminalvenster zien, is van wc. wc meldt dat er 69 “.page” -bestanden in de directory zijn.

Laten we de zaken nog eens uitbreiden. We nemen de wc commando van de commandoregel en vervang het door awk. Er zijn negen kolommen in de uitvoer van ls met de -l (lang formaat) optie. We zullen gebruiken awk om kolommen vijf, drie en negen af ​​te drukken. Dit zijn de grootte, eigenaar en naam van het bestand.

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

ls -l |  grep

We krijgen een lijst van die kolommen voor elk van de overeenkomende bestanden.

Lijst met drie kolommen voor elk overeenkomend bestand in een terminalvenster

We zullen die uitvoer nu doorgeven via de sort opdracht. We gebruiken de -n (numerieke) optie om te laten sort weet dat de eerste kolom moet worden behandeld als getallen.

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

ls -l |  grep

De uitvoer is nu gesorteerd op volgorde van bestandsgrootte, met onze aangepaste selectie van drie kolommen.

Bestanden gesorteerd op grootte in een terminalvenster

Nog een commando toevoegen

We eindigen met het toevoegen van de tail opdracht. We zullen het vertellen om alleen de laatste vijf regels met uitvoer te vermelden.

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

ls -l |  grep

Dit betekent dat onze opdracht zich vertaalt naar iets als “laat me de vijf grootste” .page “-bestanden in deze map zien, gesorteerd op grootte.” Natuurlijk is er geen commando om dat te bereiken, maar door pijpen te gebruiken, hebben we onze eigen gemaakt. We zouden dit – of een ander lang commando – kunnen toevoegen als een alias of shell-functie om al het typen op te slaan.

Hier is de output:

Vijf grootste .page-bestanden op volgorde van grootte in een terminalvenster

We kunnen de volgorde van de maat omkeren door de -r (omgekeerde) optie naar de sort commando en gebruik head in plaats van tail om de regels vanaf de bovenkant van de uitvoer te kiezen.

ls -l |  grep 

Deze keer worden de vijf grootste “.page” -bestanden weergegeven van groot naar klein:

Vijf grootste .page-bestanden in omgekeerde volgorde van grootte in een terminalvenster

Enkele recente voorbeelden

Hier zijn twee interessante voorbeelden van recente How-To-geekartikelen.

Sommige opdrachten, zoals de xargscommando, zijn ontworpen om invoer doorgestuurd te worden. Hier is een manier die we kunnen hebben wc tel de woorden, tekens en regels in meerdere bestanden door middel van piping ls in xargs die vervolgens de lijst met bestandsnamen naar wc alsof ze waren doorgegeven aan wc als opdrachtregelparameters.

ls *.page | xargs wc

ls * .pagina |  xargs wc in een terminalvenster

Het totale aantal woorden, tekens en regels wordt onder aan het terminalvenster weergegeven.

Aantal woorden, tekens en regels in een terminalvenster

Hier is een manier om een ​​gesorteerde lijst van de unieke bestandsextensies in de huidige directory te krijgen, met een telling van elk type.

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

ls |  rev |  cut -d '.'  -f1 |  rev |  sorteren |  uniq -c in een terminalvenster

Er gebeurt hier veel.

  • ls: Toont de bestanden in de directory
  • rev: Keert de tekst in de bestandsnamen om.
  • besnoeiing: Knipt de tekenreeks bij de eerste keer dat het opgegeven scheidingsteken “.” Voorkomt. Tekst hierna wordt verwijderd.
  • rev: Keert de resterende tekst om, dit is de bestandsnaamextensie.
  • soort: Sorteert de lijst alfabetisch.
  • uniq: Telt het nummer van elk uniek item in de lijst.

De uitvoer toont de lijst met bestandsextensies, alfabetisch gesorteerd met een telling van elk uniek type.

Lijst met unieke bestandsextensies in een terminalvenster

Genoemde pijpen

Er is een ander type pijp voor ons beschikbaar, genaamd pijpen. De pipes in de vorige voorbeelden worden on-the-fly gemaakt door de shell wanneer deze de opdrachtregel verwerkt. De pijpen worden gemaakt, gebruikt en vervolgens weggegooid. Ze zijn van voorbijgaande aard en laten geen spoor van zichzelf achter. Ze bestaan ​​alleen zolang het commando waarmee ze worden gebruikt actief is.

Benoemde pijpen verschijnen als permanente objecten in het bestandssysteem, zodat u ze kunt zien met ls. Ze zijn persistent omdat ze het opnieuw opstarten van de computer zullen overleven, hoewel alle ongelezen gegevens erin op dat moment worden verwijderd.

Benoemde pijpen werden veel tegelijk gebruikt om verschillende processen gegevens te laten verzenden en ontvangen, maar ik heb ze al lang niet zo zien gebruiken. Ongetwijfeld zijn er mensen die ze nog steeds met veel succes gebruiken, maar ik ben er de laatste tijd geen tegengekomen. Maar voor de volledigheid, of gewoon om uw nieuwsgierigheid te bevredigen, hier is hoe u ze kunt gebruiken.

Benoemde pijpen worden gemaakt met de mkfifo opdracht. Dit commando zal een benoemde pipe aanmaken met de naam “geek-pipe” in de huidige directory.

mkfifo geek-pipe

mkfifo geek-pipe in een terminalvenster

We kunnen de details van de named pipe zien als we de ls commando met de -l (lang formaat) optie:

ls -l geek-pipe

ls -l geek-pipe in een terminalvenster

Het eerste teken van de lijst is een “p”, wat betekent dat het een pijp is. Als het een “d” was, zou dit betekenen dat het bestandssysteemobject een directory is, en een streepje “-” zou betekenen dat het een normaal bestand is.

Met behulp van de Named Pipe

Laten we onze pijp gebruiken. De naamloze pijpen die we in onze vorige voorbeelden hebben gebruikt, hebben de gegevens onmiddellijk doorgegeven van het verzendende commando naar het ontvangende commando. Gegevens die via een named pipe worden verzonden, blijven in de pipe totdat ze worden gelezen. De gegevens worden feitelijk in het geheugen bewaard, dus de grootte van de named pipe zal niet variëren in ls vermeldingen of er gegevens in staan ​​of niet.

We gaan voor dit voorbeeld twee terminalvensters gebruiken. Ik gebruik het label:

# Terminal-1

in één terminalvenster en

# Terminal-2

in de andere, zodat u ze kunt onderscheiden. De hash “#” vertelt de shell dat wat volgt een commentaar is, en om het te negeren.

Laten we het hele vorige voorbeeld nemen en dat omleiden naar de genoemde pijp. We gebruiken dus zowel naamloze als benoemde pijpen in één opdracht:

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

ls |  rev |  cut -d '.'  -f1 |  rev |  sorteren |  uniq -c> geek-pipe in een terminalvenster” width=”646″ height=”97″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);” onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Er zal niet veel gebeuren.  U merkt misschien dat u niet terugkeert naar de opdrachtprompt, dus er is iets aan de hand.</p>
<p>Voer in het andere terminalvenster deze opdracht uit:</p>
<pre>cat < geek-pipe</pre>
<p><img loading=

We leiden de inhoud van de genoemde pijp om naar cat, zodat cat zal die inhoud weergeven in het tweede terminalvenster. Hier is de output:

De inhoud van de genoemde doorgesluisde weergegeven in een terminalvenster

En je zult zien dat je bent teruggekeerd naar de opdrachtprompt in het eerste terminalvenster.

Voltooide taak en de opdrachtprompt in een terminalvenster

Dus wat is er net gebeurd?

  • We hebben wat uitvoer omgeleid naar de named pipe.
  • Het eerste terminalvenster keerde niet terug naar de opdrachtprompt.
  • De gegevens bleven in de buis totdat ze werden gelezen uit de buis in de tweede terminal.
  • We werden teruggebracht naar de opdrachtprompt in het eerste terminalvenster.

U denkt misschien dat u de opdracht in het eerste terminalvenster als een achtergrondtaak kunt uitvoeren door een & aan het einde van de opdracht. En je zou gelijk hebben. In dat geval zouden we onmiddellijk zijn teruggekeerd naar de opdrachtprompt.

Het punt van niet het gebruik van achtergrondverwerking was om te benadrukken dat een named pipe een blokkeerproces. Door iets in een named pipe te plaatsen, wordt slechts één uiteinde van de pipe geopend. Het andere uiteinde wordt pas geopend als het leesprogramma de gegevens extraheert. De kernel schort het proces op in het eerste terminalvenster totdat de gegevens van het andere uiteinde van de pipe worden gelezen.

De kracht van pijpen

Tegenwoordig zijn named pipes iets van een nieuwigheid.

Gewone oude Linux-leidingen zijn daarentegen een van de handigste tools die u in uw terminalvenster-toolkit kunt hebben. De Linux-opdrachtregel begint voor u tot leven te komen en u krijgt een geheel nieuwe power-up wanneer u een verzameling opdrachten kunt orkestreren om één samenhangende prestatie te produceren.

Hint voor scheiding: het is het beste om uw doorgesluisde opdrachten te schrijven door één opdracht tegelijk toe te voegen en dat deel aan het werk te krijgen, en vervolgens de volgende opdracht door te sluizen.

Nieuwste artikelen

spot_img

Related Stories

Leave A Reply

Vul alstublieft uw commentaar in!
Vul hier uw naam in