Cum să utilizați pipe pe Linux

Utilizați conductele Linux pentru a coregrafia modul în care utilitățile din linia de comandă colaborează. Simplificați procesele complexe și creșteți-vă productivitatea valorificând o colecție de comenzi de sine stătătoare și transformându-le într-o echipă unică. Vă arătăm cum.

Țevile sunt peste tot

Conductele sunt una dintre cele mai utile caracteristici ale liniei de comandă pe care le au sistemele de operare Linux și Unix. Țevile sunt folosite în nenumărate moduri. Priviți orice articol din linia de comandă Linux – pe orice site web, nu doar pe al nostru – și veți vedea că conductele apar mai des decât nu. Am revizuit câteva dintre articolele Linux de la How-To Geek, iar pipe-urile sunt folosite în toate, într-un fel sau altul.

Conductele Linux vă permit să efectuați acțiuni care nu sunt acceptate imediat de către coajă. Dar pentru că filosofia de proiectare Linux este de a avea multe utilitare mici care să le realizeze functia dedicata foarte bine, și fără funcționalitate inutilă – mantra „fă un lucru și fă-l bine” – poți conecta șiruri de comenzi împreună cu conducte, astfel încât ieșirea unei comenzi să devină intrarea alteia. Fiecare comandă pe care o introduci aduce talentul său unic echipei și în curând vei descoperi că ai adunat o echipă câștigătoare.

Un exemplu simplu

Să presupunem că avem un director plin cu multe tipuri diferite de fișiere. Vrem să știm câte fișiere de un anumit tip sunt în acel director. Există și alte modalități de a face acest lucru, dar obiectul acestui exercițiu este introducerea țevilor, așa că o vom face cu țevi.

Putem obține cu ușurință o listă a fișierelor folosind ls:

ls

Pentru a separa tipul de fișier de interes, vom folosi grep. Dorim să găsim fișiere care au cuvântul „pagină” în numele sau extensia fișierului.

Vom folosi caracterul special shell „|” pentru a canaliza ieșirea de la ls în grep.

ls | grep "page"

ls -l |  grep

grep imprimă linii care potrivește modelul său de căutare. Deci, aceasta ne oferă o listă care conține doar fișiere „.page”.

Chiar și acest exemplu banal afișează funcționalitatea conductelor. Ieșirea de la ls nu a fost trimisă în fereastra terminalului. A fost trimis la grep ca date cu care să lucreze comanda grep. Ieșirea pe care o vedem vine de la grep, care este ultima comandă din acest lanț.

Ne extindem lanțul

Să începem să extindem lanțul nostru de comenzi piperate. Putem numărați fișierele „.page”. prin adăugarea comenzii wc. Vom folosi opțiunea -l (număr de linii) cu wc. Rețineți că am adăugat și opțiunea -l (format lung) la ls . Îl vom folosi în curând.

ls - | grep "page" | wc -l

ls - |  grep

grep nu mai este ultima comandă din lanț, așa că nu-i vedem rezultatul. Ieșirea de la grep este introdusă în comanda wc. Ieșirea pe care o vedem în fereastra terminalului este de la wc. wc raportează că există 69 de fișiere „.page” în director.

  Cum să utilizați comanda man Linux: secrete și elemente de bază ascunse

Să extindem lucrurile din nou. Vom lua comanda wc de pe linia de comandă și o vom înlocui cu awk. Există nouă coloane în rezultatul de la ls cu opțiunea -l (format lung). Vom folosi awk pentru a coloane de imprimare cinci, trei și nouă. Acestea sunt dimensiunea, proprietarul și numele fișierului.

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

Obținem o listă a acelor coloane, pentru fiecare dintre fișierele care se potrivesc.

Vom trece acum acea ieșire prin comanda sortare. Vom folosi opțiunea -n (numerică) pentru a informa sortarea că prima coloană ar trebui să fie tratate ca numere.

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

Ieșirea este acum sortată în ordinea dimensiunii fișierului, cu selecția noastră personalizată de trei coloane.

Adăugarea unei alte comenzi

Vom termina prin adăugarea comenzii tail. Îi vom spune să enumere ultimele cinci linii de ieșire numai.

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

Aceasta înseamnă că comanda noastră se traduce în ceva de genul „arată-mi cele mai mari cinci fișiere „.page” din acest director, ordonate după dimensiune.” Desigur, nu există nicio comandă pentru a realiza acest lucru, dar folosind conducte, am creat-o pe a noastră. Am putea adăuga aceasta – sau orice altă comandă lungă – ca alias sau funcție de shell pentru a salva toată tastarea.

Iată rezultatul:

Am putea inversa ordinea dimensiunilor adăugând opțiunea -r (invers) la comanda sortare și folosind cap în loc de coadă pentru a alege liniile din partea de sus a ieșirii.

De data aceasta, cele mai mari cinci fișiere „.page” sunt listate de la cel mai mare la cel mai mic:

Câteva exemple recente

Iată două exemple interesante din articolele recente despre tocilar.

Unele comenzi, cum ar fi comanda xargs, sunt proiectate pentru a avea intrarea către ei. Iată o modalitate prin care putem pune wc numărarea cuvinte, personaje și rânduri în mai multe fișiere, introducând ls în xargs, care apoi furnizează lista de nume de fișiere la wc ca și cum acestea ar fi fost transmise la wc ca parametri de linie de comandă.

ls *.page | xargs wc

Numărul total de cuvinte, caractere și linii sunt listate în partea de jos a ferestrei terminalului.

  Cum să transmiteți în flux la Twitch din linia de comandă pe Linux

Iată o modalitate de a obține o listă sortată a extensiilor de fișiere unice din directorul curent, cu un număr de fiecare tip.

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

Se întâmplă multe aici.

ls: Listează fișierele din director
rev: Inversează textul în numele fișierelor.
a tăia: Taie sfoara la prima apariție a delimitatorului specificat „.”. Textul după acesta este eliminat.
rev: inversează textul rămas, care este extensia numelui de fișier.
sortare: sortează lista în ordine alfabetică.
uniq: numără numărul fiecăruia intrare unică în listă.

Rezultatul arată lista de extensii de fișiere, sortate alfabetic cu un număr de fiecare tip unic.

Țevi numite

Există un alt tip de țeavă disponibil la noi, numit țevi numite. Țevile din exemplele anterioare sunt create din mers de către shell atunci când procesează linia de comandă. Țevile sunt create, utilizate și apoi aruncate. Sunt trecatori și nu lasă nicio urmă de ei înșiși. Acestea există doar atâta timp cât se execută comanda care le folosește.

Conductele numite apar ca obiecte persistente în sistemul de fișiere, astfel încât să le puteți vedea folosind ls. Sunt persistente, deoarece vor supraviețui unei reporniri a computerului, deși orice date necitite din ele în acel moment vor fi eliminate.

Conductele numite au fost folosite mult la un moment dat pentru a permite diferitelor procese să trimită și să primească date, dar nu le-am văzut de multă vreme folosite în acest fel. Fără îndoială, există oameni care încă le folosesc cu mare efect, dar nu am întâlnit niciunul recent. Dar de dragul completității sau doar pentru a vă satisface curiozitatea, iată cum le puteți folosi.

Conductele numite sunt create cu comanda mkfifo. Această comandă va crea o conductă numită numit „geek-pipe” în directorul curent.

mkfifo geek-pipe

Putem vedea detaliile conductei numite dacă folosim comanda ls cu opțiunea -l (format lung):

ls -l geek-pipe

Primul caracter al listei este „p”, adică este o țeavă. Dacă ar fi un „d”, ar însemna că obiectul sistemului de fișiere este un director, iar o liniuță „-” ar însemna că este un fișier obișnuit.

Folosind conducta numită

Să ne folosim țeava. Tuburile fără nume pe care le-am folosit în exemplele noastre anterioare au transmis datele imediat de la comanda de trimitere la comanda de primire. Datele trimise printr-o conductă numită vor rămâne în conductă până când sunt citite. Datele sunt de fapt păstrate în memorie, astfel încât dimensiunea conductei numite nu va varia în listele ls, indiferent dacă există date în el sau nu.

  Cum să instalați și să utilizați Stacer pe Linux

Vom folosi două ferestre de terminal pentru acest exemplu. Voi folosi eticheta:

# Terminal-1

într-o fereastră de terminal și

# Terminal-2

în celălalt, astfel încât să poți face diferența între ele. Hash „#” îi spune shell-ului că ceea ce urmează este un comentariu și să-l ignore.

Să luăm integral exemplul nostru anterior și să îl redirecționăm în conducta numită. Deci, folosim atât conducte fără nume, cât și conducte cu nume într-o singură comandă:

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

ls |  rev |  cut -d'.'  -f1 |  rev |  sortare |  uniq -c > geek-pipe într-o fereastră de terminal” width=”646″ height=”97″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Nimic nu se va întâmpla prea mult.  Este posibil să observați că nu veți reveni la promptul de comandă, așa că se întâmplă ceva.</p>
<p>În cealaltă fereastră de terminal, lansați această comandă:</p>
<pre>cat < geek- conductă</pre>
<p><img loading=

Redirecționăm conținutul conductei numite în cat, astfel încât pisica să afișeze acel conținut în a doua fereastră de terminal. Iată rezultatul:

Și veți vedea că ați revenit la promptul de comandă din prima fereastră de terminal.

Deci, ce tocmai sa întâmplat.

Am redirecționat unele rezultate în conducta numită.
Prima fereastră de terminal nu a revenit la promptul de comandă.
Datele au rămas în conductă până când au fost citite din conducta din al doilea terminal.
Am fost returnați la promptul de comandă din prima fereastră de terminal.

S-ar putea să vă gândiți că ați putea rula comanda în prima fereastră de terminal ca sarcină de fundal, adăugând un & la sfârșitul comenzii. Și ai avea dreptate. În acest caz, am fi revenit imediat la promptul de comandă.

Ideea de a nu folosi procesarea în fundal a fost să evidențiem faptul că o conductă numită este un proces de blocare. Punerea a ceva într-o țeavă numită deschide doar un capăt al țevii. Celălalt capăt nu este deschis până când programul de citire extrage datele. Nucleul suspendă procesul în prima fereastră de terminal până când datele sunt citite de la celălalt capăt al conductei.

Puterea țevilor

În zilele noastre, țevile denumite sunt ceva nou.

Pe de altă parte, țevile Linux vechi simple sunt unul dintre cele mai utile instrumente pe care le puteți avea în setul dvs. de instrumente pentru fereastră de terminal. Linia de comandă Linux începe să prindă viață pentru dvs. și obțineți o nouă pornire atunci când puteți orchestra o colecție de comenzi pentru a produce o performanță coerentă.

Sugestie de despărțire: Cel mai bine este să scrieți comenzile cu canalizare adăugând o comandă la un moment dat și făcând ca porțiunea să funcționeze, apoi introducând comanda următoare.