A csövek használata Linuxon

Linux pipesekkel koreografálja a parancssori segédprogramok együttműködését. Egyszerűsítse le az összetett folyamatokat, és növelje termelékenységét önálló parancsok gyűjteményének kihasználásával, és egységes csapattá alakításával. Megmutatjuk, hogyan.

Csövek mindenhol vannak

A csövek az egyik leghasznosabb parancssori funkció, amellyel a Linux és a Unix-szerű operációs rendszerek rendelkeznek. A csöveket számtalan módon használják. Tekintse meg bármelyik Linux parancssori cikket – nem csak a mi webhelyünkön –, és látni fogja, hogy a csövek gyakrabban jelennek meg. Átnéztem néhány How-To Geek Linux-cikket, és mindegyikben csöveket használnak, így vagy úgy.

A Linux csövek lehetővé teszik olyan műveletek végrehajtását, amelyeket a doboz nem támogat héj. Hanem azért, mert a Linux tervezési filozófiája az, hogy sok kis segédprogram legyen, amelyek elvégzik a sajátjukat dedikált funkció nagyon jól, és szükségtelen funkcionalitás – a „csináld egy dolgot, és csináld jól” mantra – nélkül a parancssorokat csővel összeillesztheted, így az egyik parancs kimenete egy másik parancs bemenetévé válik. Minden egyes beadott parancs egyedi tehetséget hoz a csapatba, és hamarosan rájössz, hogy egy győztes csapatot állítottál össze.

Egy egyszerű példa

Tegyük fel, hogy van egy könyvtárunk, amely tele van különféle típusú fájlokkal. Szeretnénk tudni, hogy egy adott típusú fájl hány fájlja van abban a könyvtárban. Vannak más módok is erre, de ennek a gyakorlatnak a célja a csövek bemutatása, ezért ezt csövekkel fogjuk megtenni.

Az ls használatával egyszerűen megkaphatjuk a fájlok listáját:

ls

A kívánt fájltípus elkülönítéséhez grep-et használunk. Olyan fájlokat szeretnénk találni, amelyek fájlnevében vagy kiterjesztésében az „oldal” szó szerepel.

A „|” shell speciális karaktert fogjuk használni hogy az ls kimenetét a grepbe vezesse.

ls | grep "page"

ls -l |  grep

grep olyan sorokat nyomtat ki megfeleljen a keresési mintának. Így egy olyan listát kapunk, amely csak „.page” fájlokat tartalmaz.

Még ez a triviális példa is bemutatja a csövek funkcionalitását. Az ls kimenete nem lett elküldve a terminálablakba. A grep-nek adatként küldték el, hogy a grep parancs működjön. A látott kimenet a grep-ből származik, amely az utolsó parancs ebben a láncban.

  Hogyan lehet tartalmat átküldeni a Chrome-ból a Google Home-ra

Láncunk kiterjesztése

Kezdjük kiterjeszteni a vezetékes parancsok láncát. Tudunk számolja meg a „.page” fájlokat a wc parancs hozzáadásával. A wc-vel a -l (sorszám) opciót fogjuk használni. Ne feledje, a -l (hosszú formátum) opciót is hozzáadtuk az ls-hez. Hamarosan ezt fogjuk használni.

ls - | grep "page" | wc -l

ls - |  grep

A grep már nem az utolsó parancs a láncban, így nem látjuk a kimenetét. A grep kimenete a wc parancsba kerül. A terminál ablakban látható kimenet a wc-ről származik. A wc jelentése szerint 69 „.page” fájl van a könyvtárban.

Bővítsük újra a dolgokat. A wc parancsot kivesszük a parancssorból, és lecseréljük az awk-ra. Kilenc oszlop van az ls kimenetében a -l (hosszú formátum) opcióval. Az awk-t fogjuk használni oszlopok nyomtatása öt, három és kilenc. Ezek a fájl mérete, tulajdonosa és neve.

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

Minden egyes megfelelő fájlhoz listát kapunk ezekről az oszlopokról.

Ezt a kimenetet a sort parancson keresztül továbbítjuk. Az -n (numerikus) kapcsolót használjuk, hogy tudatjuk a rendezéssel, hogy az első oszlopnak kell lennie számként kezeljük.

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

A kimenet most fájlméret szerinti sorrendben van rendezve, testreszabott három oszlopból álló kiválasztással.

Újabb parancs hozzáadása

Befejezzük a tail parancs hozzáadásával. Megmondjuk, hogy sorolja fel a a kimenet utolsó öt sora csak.

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

Ez azt jelenti, hogy a parancsunk valami ilyesmit jelent: „mutasd meg az öt legnagyobb „.page” fájlt ebben a könyvtárban, méret szerint rendezve. Természetesen erre nincs parancs, de csövek használatával létrehoztuk a sajátunkat. Hozzáadhatjuk ezt – vagy bármely más hosszú parancsot – álnévként vagy shell függvényként, hogy elmentsük az összes gépelést.

Íme a kimenet:

Megfordíthatjuk a méretsorrendet, ha hozzáadjuk a -r (fordított) kapcsolót a sort parancshoz, és a head helyett a tail-t használjuk a sorok kiválasztásához. a kimenet tetejéről.

Ezúttal az öt legnagyobb „.page” fájl szerepel a legnagyobbtól a legkisebbig:

Néhány legutóbbi példa

Íme két érdekes példa a legújabb How-To geek cikkekből.

Egyes parancsok, például az xargscommand, meg vannak tervezve hogy bemeneti adatot küldjenek nekik. Itt van egy módja annak, hogy a wc-t számoljuk szavakat, karaktereket és sorokat több fájlban, az ls-t az xargs-ba helyezve, amely a fájlnevek listáját továbbítja a wc-nek, mintha parancssori paraméterként adták volna át a wc-nek.

ls *.page | xargs wc

A szavak, karakterek és sorok teljes száma a terminálablak alján látható.

  Hozzon létre egy színsémát az Ön által választott egyetlen szín köré

Itt van egy módja annak, hogy rendezett listát kapjon az aktuális könyvtárban található egyedi fájlkiterjesztésekről, az egyes típusok számával.

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

Sok minden történik itt.

ls: Felsorolja a könyvtárban lévő fájlokat
fordulat: Megfordítja a szöveget a fájlnevekben.
vágott: Elvágja a húrt a megadott „.” határoló első előfordulásakor. Az ezt követő szöveg elvetésre kerül.
rev: Megfordítja a fennmaradó szöveget, amely a fájlnév kiterjesztése.
rendezés: A listát ábécé szerint rendezi.
uniq: Megszámolja mindegyik számát egyedi bejegyzés a listában.

A kimenet megjeleníti a fájlkiterjesztések listáját, ábécé sorrendben, az egyes típusok számával.

Pipes néven

Rendelkezésünkre áll egy másik típusú cső, az úgynevezett csövek. Az előző példákban szereplő csöveket menet közben hozza létre a shell, amikor feldolgozza a parancssort. A csöveket létrehozzák, felhasználják, majd eldobják. Átmenetiek és nem hagynak nyomot maguknak. Csak addig léteznek, amíg az őket használó parancs fut.

A nevesített csövek állandó objektumként jelennek meg a fájlrendszerben, így az ls használatával láthatja őket. Kitartóak, mert túlélik a számítógép újraindítását – bár a bennük lévő olvasatlan adatok el lesznek vetve.

A névvel ellátott csöveket egy időben nagyon sokat használták, hogy különböző folyamatok küldhessenek és fogadhassanak adatot, de régen nem láttam ilyet használni. Kétségtelen, hogy vannak olyanok, akik még mindig nagyszerűen használják őket, de mostanában nem találkoztam ilyennel. De a teljesség kedvéért, vagy csak a kíváncsiság kielégítése érdekében, íme, hogyan használhatod őket.

Az elnevezett csövek az mkfifo paranccsal jönnek létre. Ezt a parancsot nevű csövet hoz létre az aktuális könyvtárban „geek-pipe” néven.

mkfifo geek-pipe

A megnevezett cső részleteit akkor láthatjuk, ha az ls parancsot a -l (hosszú formátum) kapcsolóval használjuk:

ls -l geek-pipe

A lista első karaktere egy „p”, azaz pipa. Ha „d” lenne, az azt jelentené, hogy a fájlrendszer-objektum egy könyvtár, a kötőjel „-” pedig azt, hogy normál fájl.

A Named Pipe használata

Használjuk a pipánkat. A korábbi példákban használt névtelen csövek az adatokat azonnal átadták a küldő parancsból a fogadó parancsnak. Az elnevezett csövön keresztül küldött adatok a csőben maradnak, amíg be nem olvassák. Az adatok valójában a memóriában vannak tárolva, így a megnevezett cső mérete nem változik az ls listákban, függetlenül attól, hogy van-e benne adat vagy sem.

  A Samsung Galaxy S20 kikapcsolása vagy újraindítása

Ebben a példában két terminálablakot fogunk használni. Használom a címkét:

# Terminal-1

egy terminál ablakban és

# Terminal-2

a másikban, hogy meg tudja különböztetni őket. A „#” hash jelzi a shell-nek, hogy ami ezután következik, az megjegyzés, és figyelmen kívül kell hagyni.

Vegyük az előző példánkat, és irányítsuk át a megnevezett csőbe. Tehát mind a névtelen, mind a névtelen csöveket egy parancsban használjuk:

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

ls |  fordulat |  cut -d'.'  -f1 |  fordulat |  rendezés |  uniq -c > geek-pipe egy terminálablakban” width=”646″ height=”97″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onrror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Úgy tűnik, semmi sem fog történni.  Észreveheti, hogy nem tér vissza a parancssorba, tehát valami történik.</p>
<p>A másik terminálablakban adja ki ezt a parancsot:</p>
<pre>cat < geek- cső</pre>
<p><img loading=

A megnevezett cső tartalmát átirányítjuk a cat-ba, hogy a macska ezt a tartalmat a második terminálablakban jelenítse meg. Íme a kimenet:

És látni fogja, hogy visszakerült a parancssorba az első terminálablakban.

Szóval, mi történt.

Néhány kimenetet átirányítottunk a megnevezett csőbe.
Az első terminálablak nem tért vissza a parancssorba.
Az adatok addig maradtak a csőben, amíg ki nem olvasták a második terminálban lévő csőből.
Visszakerültünk a parancssorba az első terminálablakban.

Lehet, hogy úgy gondolja, hogy háttérfeladatként futtathatja a parancsot az első terminálablakban, ha a parancs végéhez hozzáad egy & jelet. És igazad lenne. Ebben az esetben azonnal visszakerültünk volna a parancssorba.

A háttérfeldolgozás mellőzésének az volt a célja, hogy rávilágítsak arra, hogy egy elnevezett cső blokkoló folyamat. Ha valamit egy elnevezett csőbe teszünk, az csak a cső egyik végét nyitja meg. A másik végét addig nem nyitják meg, amíg az olvasó program ki nem bontja az adatokat. A kernel az első terminálablakban felfüggeszti a folyamatot mindaddig, amíg az adatok ki nem kerülnek a cső másik végéből.

A csövek ereje

Manapság a névre keresztelt csövek valami újdonságnak számítanak.

A sima régi Linux-csövek viszont az egyik leghasznosabb eszköz, amely a terminálablak eszközkészletében megtalálható. A Linux parancssor kezd életre kelni az Ön számára, és teljesen új teljesítményt kap, amikor parancsok gyűjteményét hangszerelheti egyetlen egységes teljesítmény elérése érdekében.

Elválasztási tipp: A legjobb, ha úgy írja ki a vezetékes parancsokat, hogy egyszerre egy parancsot ad hozzá, és az adott részt működésbe hozza, majd beírja a következő parancsot.