Jak používat Pipes na Linuxu

Použijte linuxové kanály k choreografii, jak spolupracují nástroje příkazového řádku. Zjednodušte složité procesy a zvyšte svou produktivitu tím, že využijete sadu samostatných příkazů a proměníte je v tým s jediným zaměřením. Ukážeme vám jak.

Trubky jsou všude

Pipes jsou jednou z nejužitečnějších funkcí příkazového řádku, které mají operační systémy Linux a Unix. Trubky se používají nesčetnými způsoby. Podívejte se na jakýkoli článek příkazového řádku Linuxu – na libovolném webu, nejen na našem – a uvidíte, že potrubí se objevuje častěji než ne. Prohlédl jsem si některé články How-To Geek’s Linux a ve všech se tak či onak používají roury.

Linuxové kanály vám umožňují provádět akce, které nejsou podporovány přímo z krabice skořápka. Ale protože filozofií designu Linuxu je mít mnoho malých utilit, které provádějí své dedikovaná funkce velmi dobřea bez zbytečných funkcí – mantry „dělej jednu věc a dělej to dobře“ – můžete spojovat řetězce příkazů spolu s rourami, takže výstup jednoho příkazu se stane vstupem druhého. Každý příkaz, který zadáte, přináší do týmu svůj jedinečný talent a brzy zjistíte, že jste sestavili vítězný tým.

Jednoduchý příklad

Předpokládejme, že máme adresář plný mnoha různých typů souborů. Chceme vědět, kolik souborů určitého typu je v tomto adresáři. Existují i ​​jiné způsoby, jak to udělat, ale cílem tohoto cvičení je představit potrubí, takže to uděláme pomocí potrubí.

Seznam souborů můžeme snadno získat pomocí ls:

ls

K oddělení typu souboru, který nás zajímá, použijeme grep. Chceme najít soubory, které mají v názvu souboru nebo příponu souboru slovo „page“.

Použijeme speciální znak shellu „|“ k potrubí výstupu z ls do grep.

ls | grep "page"

ls -l |  grep

grep vytiskne řádky, které odpovídat jeho vyhledávacímu vzoru. To nám dává seznam obsahující pouze soubory „.page“.

I tento triviální příklad ukazuje funkčnost potrubí. Výstup z ls nebyl odeslán do okna terminálu. Byl odeslán do grepu jako data pro práci s příkazem grep. Výstup, který vidíme, pochází z grep, což je poslední příkaz v tomto řetězci.

Rozšíření našeho řetězce

Začněme rozšiřovat náš řetězec zřetězených příkazů. Můžeme spočítat soubory „.page“. přidáním příkazu wc. Použijeme volbu -l (počet řádků) s wc. Všimněte si, že jsme také přidali volbu -l (dlouhý formát) do ls . Brzy to použijeme.

ls - | grep "page" | wc -l

ls - |  grep

grep již není posledním příkazem v řetězci, takže nevidíme jeho výstup. Výstup z grep je vložen do příkazu wc. Výstup, který vidíme v okně terminálu, je z wc. wc hlásí, že v adresáři je 69 souborů „.page“.

  PS5 a Xbox Series X: Co jsou Teraflops?

Pojďme věci znovu rozšířit. Odebereme příkaz wc z příkazového řádku a nahradíme jej příkazem awk. Ve výstupu z ls je devět sloupců s volbou -l (dlouhý formát). Použijeme k tomu awk tisknout sloupce pět, tři a devět. Jedná se o velikost, vlastníka a název souboru.

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

Získáme seznam těchto sloupců pro každý z odpovídajících souborů.

Nyní předáme tento výstup příkazem sort. Použijeme volbu -n (číselná) k tomu, abychom věděli, že první sloupec by měl být zacházet jako s čísly.

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

Výstup je nyní řazen podle velikosti souboru s naším přizpůsobeným výběrem tří sloupců.

Přidání dalšího příkazu

Dokončíme přidáním příkazu ocas. Řekneme mu, aby vypsal posledních pět řádků výstupu pouze.

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

To znamená, že náš příkaz se překládá na něco jako „ukaž mi pět největších souborů „.page“ v tomto adresáři, seřazených podle velikosti. Samozřejmě neexistuje žádný příkaz, který by toho dosáhl, ale pomocí potrubí jsme vytvořili vlastní. Mohli bychom přidat tento – nebo jakýkoli jiný dlouhý příkaz – jako alias nebo funkci shellu, abychom uložili veškeré psaní.

Zde je výstup:

Mohli bychom obrátit pořadí velikostí přidáním volby -r (reverse) do příkazu sort a použitím head místo tailu k výběru řádků z horní části výstupu.

Tentokrát je uvedeno pět největších souborů „.page“ od největšího po nejmenší:

Některé nedávné příklady

Zde jsou dva zajímavé příklady z nedávných článků How-To geek.

Některé příkazy, jako je xargscommand, jsou navrženy aby k nim byl přiveden vstup. Zde je způsob, jak můžeme nechat wc počítat slova, znaky a řádky ve více souborech vložením ls do xargs, které pak přidají seznam názvů souborů do wc, jako by byly předány do wc jako parametry příkazového řádku.

ls *.page | xargs wc

Celkový počet slov, znaků a řádků je uveden ve spodní části okna terminálu.

  Otestujte si svůj sluch s iPhonem a tichou místností

Zde je způsob, jak získat seřazený seznam jedinečných přípon souborů v aktuálním adresáři s počtem každého typu.

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

Tady se toho děje hodně.

ls: Zobrazí seznam souborů v adresáři
rev: Obrátí text v názvech souborů.
střih: Přestřihne provázek při prvním výskytu zadaného oddělovače „.“. Text po tomto bude zahozen.
rev: Obrátí zbývající text, což je přípona souboru.
sort: Seřadí seznam podle abecedy.
uniq: Spočítá počet každého jedinečný záznam v seznamu.

Výstup zobrazuje seznam přípon souborů seřazený abecedně s počtem každého jedinečného typu.

Pojmenované Pipes

Máme k dispozici další typ roury, nazývané pojmenované roury. Roury v předchozích příkladech jsou vytvářeny za běhu shellem, když zpracovává příkazový řádek. Trubky jsou vytvořeny, použity a poté vyřazeny. Jsou přechodné a nezanechávají po sobě žádné stopy. Existují pouze tak dlouho, dokud je spuštěn příkaz, který je používá.

Pojmenované kanály se v souborovém systému zobrazují jako trvalé objekty, takže je můžete vidět pomocí ls. Jsou trvalé, protože přežijí restart počítače – i když veškerá nepřečtená data v nich v tu chvíli budou vyřazena.

Pojmenované roury byly najednou hodně používány, aby umožňovaly různým procesům odesílat a přijímat data, ale dlouho jsem je neviděl používat tímto způsobem. Není pochyb o tom, že jsou lidé, kteří je stále používají s velkým efektem, ale v poslední době jsem se s žádnými nesetkal. Ale pro úplnost, nebo jen pro uspokojení vaší zvědavosti, zde je návod, jak je můžete použít.

Pojmenované kanály se vytvářejí pomocí příkazu mkfifo. Tento příkaz vytvoří pojmenované potrubí s názvem „geek-pipe“ v aktuálním adresáři.

mkfifo geek-pipe

Podrobnosti o pojmenovaném kanálu můžeme vidět, pokud použijeme příkaz ls s volbou -l (dlouhý formát):

ls -l geek-pipe

První znak výpisu je „p“, což znamená, že se jedná o rouru. Pokud by to bylo „d“, znamenalo by to, že objekt systému souborů je adresář a pomlčka „-“ by znamenala, že jde o běžný soubor.

Použití pojmenovaného potrubí

Použijme naši dýmku. Nepojmenované kanály, které jsme použili v našich předchozích příkladech, předávaly data okamžitě z vysílajícího příkazu do přijímajícího příkazu. Data odeslaná prostřednictvím pojmenovaného kanálu zůstanou v kanálu, dokud nebudou přečtena. Data jsou ve skutečnosti uložena v paměti, takže velikost pojmenovaného roura se ve výpisech ls nebude lišit, ať už v něm data jsou nebo ne.

  Jak přidat „Vyhledat Google“ do kontextové nabídky po kliknutí pravým tlačítkem v Microsoft Edge

Pro tento příklad použijeme dvě terminálová okna. Použiji označení:

# Terminal-1

v jednom okně terminálu a

# Terminal-2

v druhém, takže je můžete rozlišovat. Hash „#“ říká shellu, že to, co následuje, je komentář, a má to ignorovat.

Vezměme si celý náš předchozí příklad a přesměrujeme jej do pojmenovaného kanálu. V jednom příkazu tedy používáme nepojmenované i pojmenované roury:

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

ls |  rev |  cut -d'.'  -f1 |  rev |  seřadit |  uniq -c > geek-pipe v okně terminálu” width=”646″ height=”97″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Zdá se, že se nic moc neděje.  Můžete si všimnout, že se nevrátíte do příkazového řádku, takže se něco děje.</p>
<p>V druhém okně terminálu zadejte tento příkaz:</p>
<pre>cat < geek- potrubí</pre>
<p><img loading=

Přesměrováváme obsah pojmenované roury do cat, takže cat zobrazí tento obsah ve druhém okně terminálu. Zde je výstup:

A uvidíte, že jste byli vráceni do příkazového řádku v prvním okně terminálu.

Takže, co se právě stalo.

Přesměrovali jsme část výstupu do pojmenovaného kanálu.
První okno terminálu se nevrátilo do příkazového řádku.
Data zůstala v potrubí, dokud nebyla načtena z potrubí ve druhém terminálu.
Byli jsme vráceni do příkazového řádku v prvním okně terminálu.

Možná si myslíte, že byste mohli spustit příkaz v prvním okně terminálu jako úlohu na pozadí přidáním & na konec příkazu. A měl bys pravdu. V takovém případě bychom byli okamžitě vráceni do příkazového řádku.

Účelem nepoužívání zpracování na pozadí bylo zdůraznit, že pojmenovaný kanál je blokující proces. Vložením něčeho do pojmenované roury se otevře pouze jeden konec roury. Druhý konec není otevřen, dokud čtecí program extrahuje data. Jádro pozastaví proces v prvním okně terminálu, dokud se data nepřečtou z druhého konce roury.

Síla potrubí

V dnešní době jsou pojmenované dýmky něco jako novinka.

Na druhou stranu obyčejné staré linuxové roury jsou jedním z nejužitečnějších nástrojů, které můžete mít ve své sadě nástrojů pro okno terminálu. Příkazový řádek Linuxu pro vás začne ožívat a získáte zcela nový výkon, když můžete zorganizovat sbírku příkazů, abyste vytvořili jeden soudržný výkon.

Tip pro rozdělení: Nejlepší je napsat své zřetězené příkazy přidáním jednoho příkazu po druhém a uvedením této části do práce a poté přidáním dalšího příkazu.