Jak używać potoków w systemie Linux

Użyj potoków Linuksa, aby choreografować sposób współpracy narzędzi wiersza polecenia. Uprość złożone procesy i zwiększ produktywność, wykorzystując zbiór niezależnych poleceń i przekształcając je w zespół o jednym umyśle. Pokażemy Ci, jak to zrobić.

Rury są wszędzie

Potoki to jedna z najbardziej przydatnych funkcji wiersza poleceń, które mają systemy operacyjne Linux i Unix. Rury są używane na niezliczone sposoby. Spójrz na dowolny artykuł dotyczący wiersza poleceń Linuksa – w dowolnej witrynie internetowej, nie tylko naszej – a zobaczysz, że potoki pojawiają się częściej niż nie. Przejrzałem niektóre artykuły newsblog.pl dotyczące Linuksa, a rury są używane we wszystkich z nich, w taki czy inny sposób.

Potoki systemu Linux umożliwiają wykonywanie działań, które nie są obsługiwane natychmiast po zainstalowaniu przez muszla. Ale ponieważ filozofia projektowania Linuksa polega na posiadaniu wielu małych narzędzi, które wykonują swoje dedykowana funkcja bardzo dobrzei bez zbędnej funkcjonalności – mantry „zrób jedną rzecz i zrób to dobrze” – możesz łączyć ciągi poleceń razem z potokami, tak że wyjście jednego polecenia staje się wejściem innego. Każde polecenie, które wykonujesz, wnosi do zespołu swój wyjątkowy talent, a wkrótce przekonasz się, że utworzyłeś zwycięską drużynę.

Prosty przykład

Załóżmy, że mamy katalog pełen wielu różnych typów plików. Chcemy wiedzieć, ile plików określonego typu znajduje się w tym katalogu. Można to zrobić na inne sposoby, ale celem tego ćwiczenia jest wprowadzenie rur, więc zrobimy to z rurami.

Możemy łatwo uzyskać listę plików za pomocą ls:

ls

Zbieranie plików w katalogu, w oknie terminala

Aby oddzielić interesujący nas typ pliku, użyjemy grep. Chcemy znaleźć pliki, które mają słowo „strona” w nazwie lub rozszerzeniu.

Użyjemy znaku specjalnego powłoki „|” potokować wyjście z ls do grep.

ls | grep "page"

ls -l |  grep

grep wypisuje to wiersze pasuje do wzorca wyszukiwania. To daje nam listę zawierającą tylko pliki „.page”.

lista plików stron w oknie terminala

Nawet ten trywialny przykład pokazuje funkcjonalność rur. Dane wyjściowe z ls nie zostały wysłane do okna terminala. Został on wysłany do grep jako dane do pracy z poleceniem grep. Dane wyjściowe, które widzimy, pochodzą z grepa, które jest ostatnim poleceniem w tym łańcuchu.

Rozszerzanie naszej sieci

Zacznijmy rozszerzać nasz łańcuch poleceń potokowych. Możemy policzyć pliki „.page” dodając polecenie wc. Użyjemy opcji -l (liczba linii) z wc. Zauważ, że dodaliśmy również opcję -l (długi format) do ls. Niedługo będziemy go używać.

ls - | grep "page" | wc -l

ls - |  grep

grep nie jest już ostatnim poleceniem w łańcuchu, więc nie widzimy jego wyniku. Dane wyjściowe grepa są przekazywane do polecenia wc. Dane wyjściowe, które widzimy w oknie terminala, pochodzą z wc. wc zgłasza, że ​​w katalogu jest 69 plików „.page”.

Przedłużmy to jeszcze raz. Zdejmiemy polecenie wc z wiersza poleceń i zastąpimy je awk. W wyjściu ls znajduje się dziewięć kolumn z opcją -l (format długi). Użyjemy awk do drukuj kolumny pięć, trzy i dziewięć. Są to rozmiar, właściciel i nazwa pliku.

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

ls -l |  grep

Otrzymujemy listę tych kolumn dla każdego pasującego pliku.

Lista trzech kolumn dla każdego pasującego pliku w oknie terminala

Przekażemy teraz te dane wyjściowe za pomocą polecenia sort. Użyjemy opcji -n (numeric), aby poinformować sortowanie, że powinna być pierwsza kolumna traktowane jako liczby.

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

ls -l |  grep

Dane wyjściowe są teraz sortowane według rozmiaru pliku, z naszym dostosowanym wyborem trzech kolumn.

Pliki posortowane według rozmiaru w oknie terminala

Dodawanie kolejnego polecenia

Skończymy dodając polecenie tail. Powiemy mu, aby wyświetlić listę ostatnie pięć wierszy wyjścia tylko.

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

ls -l |  grep

Oznacza to, że nasze polecenie tłumaczy się na coś w stylu „pokaż mi pięć największych plików„ .page ”w tym katalogu, uporządkowanych według rozmiaru”. Oczywiście nie ma polecenia, aby to zrobić, ale używając rur stworzyliśmy własne. Moglibyśmy dodać to – lub dowolne inne długie polecenie – jako alias lub funkcję powłoki, aby zapisać całe wpisywanie.

Oto wynik:

Pięć największych plików .page uporządkowanych według rozmiaru w oknie terminala

Mogliśmy odwrócić kolejność rozmiarów, dodając opcję -r (odwróć) do polecenia sortowania i używając nagłówka zamiast ogona do wybrania linii od góry wyjścia.

ls -l |  grep 

Tym razem pięć największych plików „.page” jest wymienionych od największego do najmniejszego:

Pięć największych plików .page wymienionych w odwrotnej kolejności w oknie terminala

Niektóre najnowsze przykłady

Oto dwa interesujące przykłady z ostatnich artykułów dla maniaków How-To.

Zaprojektowano niektóre polecenia, takie jak xargscommand aby dane wejściowe zostały do ​​nich przesłane potokiem. Oto sposób, w jaki możemy policzyć wc słowa, znaki i linie w wielu plikach, przesyłając potokiem ls do xargs, który następnie podaje listę nazw plików do wc, tak jakby zostały one przekazane do wc jako parametry wiersza poleceń.

ls *.page | xargs wc

ls * .page |  xargs wc w oknie terminala

Całkowita liczba słów, znaków i wierszy jest podana na dole okna terminala.

Liczba słów, znaków i wierszy w oknie terminala

Oto sposób na uzyskanie posortowanej listy unikatowych rozszerzeń plików w bieżącym katalogu, z liczbą każdego typu.

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

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

Dużo się tu dzieje.

ls: Wyświetla pliki w katalogu
obrót silnika: Odwraca tekst w nazwach plików.
skaleczenie: Przecina sznurek przy pierwszym wystąpieniu określonego separatora „.”. Tekst po tym jest odrzucany.
rev: Odwraca pozostały tekst, który jest rozszerzeniem nazwy pliku.
sort: sortuje listę alfabetycznie.
uniq: Zlicza liczbę każdego unikalny wpis na liście.

Dane wyjściowe przedstawiają listę rozszerzeń plików, posortowaną alfabetycznie według liczby każdego unikalnego typu.

Lista unikalnych rozszerzeń plików w oknie terminala

Nazwane rury

Dostępny jest inny typ potoku, zwany potokami nazwanymi. Rury w poprzednich przykładach są tworzone w locie przez powłokę, gdy przetwarza ona wiersz poleceń. Rury są tworzone, używane, a następnie odrzucane. Są przemijające i nie pozostawiają po sobie śladu. Istnieją tylko tak długo, jak długo działa polecenie, które ich używa.

Nazwane potoki pojawiają się jako trwałe obiekty w systemie plików, więc możesz je zobaczyć za pomocą ls. Są trwałe, ponieważ przetrwają ponowne uruchomienie komputera – chociaż wszelkie nieprzeczytane dane w nich w tym czasie zostaną odrzucone.

Nazwane potoki były często używane w tym samym czasie, aby umożliwić różnym procesom wysyłanie i odbieranie danych, ale od dawna nie widziałem ich w ten sposób. Bez wątpienia są ludzie, którzy nadal używają ich z doskonałym skutkiem, ale ostatnio ich nie spotkałem. Ale dla zachowania kompletności lub po prostu dla zaspokojenia ciekawości, oto jak możesz z nich korzystać.

Nazwane potoki są tworzone za pomocą polecenia mkfifo. To polecenie utworzy nazwany potok nazywany „geek-pipe” w bieżącym katalogu.

mkfifo geek-pipe

mkfifo geek-pipe w oknie terminala

Możemy zobaczyć szczegóły nazwanego potoku, jeśli użyjemy polecenia ls z opcją -l (długi format):

ls -l geek-pipe

ls -l geek-pipe w oknie terminala

Pierwszy znak na liście to „p”, co oznacza, że ​​jest to potok. Gdyby to było „d”, oznaczałoby to, że obiekt systemu plików jest katalogiem, a myślnik „-” oznaczałby, że jest to zwykły plik.

Korzystanie z nazwanego potoku

Użyjmy naszej fajki. Nienazwane potoki, których użyliśmy w naszych poprzednich przykładach, przekazywały dane natychmiast z polecenia wysyłającego do polecenia odbierającego. Dane przesłane przez nazwany potok pozostaną w potoku do momentu ich odczytania. Dane są faktycznie przechowywane w pamięci, więc rozmiar nazwanego potoku nie będzie się różnić w listach ls, niezależnie od tego, czy są w nim dane, czy nie.

W tym przykładzie użyjemy dwóch okien terminala. Użyję etykiety:

# Terminal-1

w jednym oknie terminala i

# Terminal-2

w drugim, abyś mógł je rozróżnić. Hash „#” informuje powłokę, że to, co następuje, jest komentarzem, i że ma go zignorować.

Weźmy cały nasz poprzedni przykład i przekierujmy go do nazwanego potoku. Więc używamy zarówno nienazwanych, jak i nazwanych potoków w jednym poleceniu:

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

ls |  rev |  cut -d '.'  -f1 |  rev |  sort |  uniq -c> geek-pipe w oknie terminala ”width =” 646 ″ height = ”97 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> Wydaje się, że nic szczególnego się nie wydarzy.  Możesz jednak zauważyć, że nie wracasz do wiersza poleceń, więc coś się dzieje. </p>
<p> W drugim oknie terminala wydaj to polecenie: </p>
<pre> cat <geek- pipe </pre>
<p> <img loading =

Przekierowujemy zawartość nazwanego potoku do cat, aby cat wyświetlił tę zawartość w drugim oknie terminala. Oto wynik:

Zawartość nazwanego potoku pokazana w oknie terminala

Zobaczysz, że wróciłeś do wiersza poleceń w pierwszym oknie terminala.

Ukończone zadanie i wiersz polecenia w oknie terminala

Więc co się właśnie stało.

Przekierowaliśmy część danych wyjściowych do nazwanego potoku.
Pierwsze okno terminala nie powróciło do wiersza poleceń.
Dane pozostawały w rurze, dopóki nie zostały odczytane z rury w drugim terminalu.
Wróciliśmy do wiersza poleceń w pierwszym oknie terminala.

Możesz pomyśleć, że możesz uruchomić polecenie w pierwszym oknie terminala jako zadanie w tle, dodając & na końcu polecenia. I miałbyś rację. W takim przypadku natychmiast powrócilibyśmy do wiersza poleceń.

Celem nieużywania przetwarzania w tle było podkreślenie, że nazwany potok jest procesem blokującym. Umieszczenie czegoś w nazwanej potoku otwiera tylko jeden koniec potoku. Drugi koniec nie jest otwierany, dopóki program odczytujący nie wyodrębni danych. Jądro zawiesza proces w pierwszym oknie terminala, dopóki dane nie zostaną odczytane z drugiego końca potoku.

Potęga rur

W dzisiejszych czasach nazwane fajki są czymś w rodzaju nowości.

Z drugiej strony zwykłe stare potoki Linuksa są jednym z najbardziej przydatnych narzędzi, jakie możesz mieć w zestawie narzędzi okna terminala. Linia poleceń Linuksa zaczyna ożywać i zyskujesz zupełnie nowe moce, gdy możesz zaaranżować zbiór poleceń, aby uzyskać jedną spójną wydajność.

Wskazówka dotycząca rozstania: najlepiej jest pisać polecenia potokowe, dodając po jednym poleceniu na raz i uruchamiając tę ​​część, a następnie wprowadzając rurociąg do następnego polecenia.