Gdybyś pomagał komuś nauczyć się pojęcia potoków w wierszu poleceń, jakiego przykładu byś użył? Przykład, który się pojawił, był następujący:
cat whatever.txt | less
Wydaje mi się, że nie jest to najlepszy przykład, ponieważ jest tylko jeden krok. Jakie jest dobre, ale fundamentalne zastosowanie |
?
Idealnie w przykładzie, który przedstawię, będą używać programów, które same mają wyjścia, które mogą być uruchamiane niezależnie, a następnie wyświetlane razem.
command-line
pipe
Mateusz
źródło
źródło
cat
tego, ponieważless whatever.txt
działa dobrze.Odpowiedzi:
Przedstawię ci nieco skomplikowany przykład oparty na prawdziwym scenariuszu.
Problem
Powiedzmy, że polecenie
conky
przestało odpowiadać na moim pulpicie i chcę go zabić ręcznie. Znam trochę Uniksa, więc wiem, że muszę wykonać poleceniekill <PID>
. W celu odzyskania PID, można użyćps
lubtop
czy cokolwiek narzędzie mój rozkład Unix mi dał. Ale jak mogę to zrobić za pomocą jednego polecenia?Odpowiedź
ZASTRZEŻENIE: To polecenie działa tylko w niektórych przypadkach. Nie kopiuj / wklej go w swoim terminalu i zacznij go używać, może to nieświadomie zabić procesy. Naucz się raczej, jak go zbudować .
Jak to działa
1-
ps aux
To polecenie wyświetli listę uruchomionych procesów i informacje o nich. Ciekawą informacją jest to, że wyświetli PID każdego procesu w drugiej kolumnie. Oto fragment danych wyjściowych polecenia na moim pudełku:
2-
grep conky
Interesuje mnie tylko jeden proces, więc
grep
znajduję wpis odpowiadający mojemu programowiconky
.3-
grep -v grep
Jak widać w kroku 2, polecenie
ps
wyświetlagrep conky
proces na liście (w końcu jest uruchomionym procesem). Aby go przefiltrować, mogę uruchomićgrep -v grep
. Ta opcja-v
mówigrep
o dopasowaniu wszystkich linii oprócz linii zawierających wzór.NB: Chciałbym znać sposób na wykonanie czynności 2 i 3 w jednym
grep
połączeniu.4-
awk '{print $2}'
Teraz, gdy wyizolowałem proces docelowy. Chcę odzyskać jego PID. Innymi słowy, chcę odzyskać drugie słowo wyniku. Na szczęście dla mnie większość (wszystkich?) Współczesnych jednorożców dostarczy jakąś wersję
awk
języka skryptowego, który robi cuda z danymi tabelarycznymi. Nasze zadanie staje się tak proste jakprint $2
.5-
xargs kill
Mam PID. Wszystko czego potrzebuję to przekazać
kill
. Aby to zrobić, użyjęxargs
.xargs kill
odczyta dane wejściowe (w naszym przypadku z potoku), utworzy polecenie składające się zkill <items>
(<items>
są czymkolwiek odczytane z danych wejściowych), a następnie wykona utworzone polecenie. W naszym przypadku zostanie wykonanekill 1948
. Misja zakończona sukcesem.Ostatnie słowa
Zauważ, że w zależności od używanej wersji Uniksa niektóre programy mogą zachowywać się nieco inaczej (na przykład
ps
mogą wyświetlać PID w kolumnie $ 3). Jeśli coś wydaje się niewłaściwe lub inne, przeczytaj dokumentację dostawcy (lub lepiejman
strony). Uważaj również, ponieważ długie rury mogą być niebezpieczne. Nie przyjmuj żadnych założeń, szczególnie podczas używania poleceń takich jakkill
lubrm
. Na przykład, jeśli istnieje inny użytkownik o nazwie „conky” (lub „Aconkyous”), moje polecenie może zabić wszystkie jego uruchomione procesy!Mówię ostrożnie, szczególnie w przypadku długich rur. Zawsze lepiej jest budować go interaktywnie, tak jak my tutaj, niż zakładać i później żałować.
źródło
kill $(pgrep conky)
pkill conky
grep
połączeniu.grep [c]onky
jest tym, czego szukasz.Moim ulubionym jest ten:
youtube-dl $1 -q -o - | ffmpeg -i - $2
pobiera wideo z podanego adresu URL YouTube i przekazuje
$1
go jako plik podany przez$2
. Zwróć uwagę, jak plik jest po cichu-q
przesyłany do STDOUT-o -
, przesyłany potokowo do ffmpeg i wykorzystywany przez niego jako dane wejściowe-i -
.Szczególnie dla początkujących Linuksa może to być praktyczny przykład, dlaczego wiersz poleceń może być użyteczny i ułatwiać korzystanie z narzędzi GUI. Nie jestem pewien, ile czasu zajęłoby pobranie filmu z YouTube i przekonwertowanie jego dźwięku na format mp3. Powyższa linia może to zrobić w ciągu kilku sekund.
źródło
youtube-dl --extract-audio --audio-format mp3 -a -
. Wciąż fajny przykład, ale są na to łatwiejsze sposoby. (Nazywa się ffmpeg wewnętrznie.)youtube-dl $1 -q -o - | mplayer -
bezpośrednio odtwarza wideo w MPlayerze. Używam tego polecenia z laptopa, aby powiedzieć mojemu serwerowi (który jest podłączony do telewizora), aby odtwarzał filmy. Muszę dołączyć,-display :0.0 -geometry 400x300+1200+200
aby okno mplayera pojawiło się na odpowiednim ekranie.Ogólne zastosowanie (czytaj: sposób, w jaki najczęściej go używam) polega na tym, że z jakiegoś powodu muszę uruchamiać niektóre dane za pomocą kilku narzędzi, aby wykonywać różne zadania przetwarzania.
Więc powiedziałbym stosowanie rur jest jako klej do montażu kilka cegiełek (różne narzędzia UNIX) razem. Jak powiedział Ulrich, i jest to powszechna zwrotka.
sort
uniq
W zależności od odbiorców, jeśli chcesz podkreślić wykorzystanie rur, możesz na przykład zacząć od: „hej, ten program zawiera linki do kilku interesujących plików PDF z artykułami i notatkami z wykładów, ale niektóre z nich są powtarzane. jakoś to zautomatyzować? ”
Następnie możesz pokazać, w jaki sposób
lynx --dump --listonly
pobiera listę linków, jakgrep
można filtrować linki kończące się na.pdf
, jakcolrm
lubsed
można pozbyć się liczblynx
zapisywanych do każdego adresu URL, jaksort
i jakuniq
można pozbyć się duplikatów, a na koniec, jakwget -i -
można użyć do odzyskania pliki (--wait
oczywiście łagodne dla serwera).Obawiam się, że to złożony przykład. Z drugiej strony, może pomóc pokazać moc potoków, gdy po prostu potokujesz i masz powłokę uruchamiającą wszystko naraz.
źródło
sort -u
w jądrach GNU .Nie wiem dokładnie, co jest dobre, ale przesyłanie strumieniowe
grep
musi być jednym z najczęstszych zastosowań, prawdopodobnie po nimwc -l
. (Tak,grep
ma mało znany-c
przełącznik.)Inną powszechną zwrotką jest
| sort | uniq
choćby dlatego, żeuniq
wymaga sortowania danych wejściowych.źródło
... | sort -u
jeśli są dostępne!Nie dlatego, że potrzebujesz go w tym przykładzie, ale:
... odwrócenie kolejności greps zachowuje kolorowanie, ale jest DUŻO mniej wydajne. przypuszczalnie na dużych listach kolor nie miałby znaczenia.
ta strona sugeruje również:
https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep
... ale to nie zadziała, jeśli szukasz pojedynczej litery (np. proces „X”).
źródło
W końcu mogę podzielić się tym bałaganem oneliner, który zrobiłem około półtora roku temu ...
To...
Założę się, że można to zrobić o wiele lepiej za pomocą jednego skryptu Python.
źródło
To pierwsza rzecz, która przyszła mi do głowy ...
mysqldump
to aplikacja konsolowa, która wysyła dane, schemat oraz opcjonalnie procedury i funkcje do standardowego wyjścia. Zwykle zostaje przekierowany do pliku w celu utworzenia kopii zapasowej.mysqldump <options> > mydb.dump
To dałoby ci nieskompresowany skrypt SQL. Aby zaoszczędzić miejsce, możesz skompresować go za pomocą bzip2.
bzip2 mydb.dump
Alternatywnie możesz zrobić jedno i drugie w jednym kroku:
mysqldump <options> | bzip2 > mydb.dump.bz2
W powyższym przykładzie stdout z
mysqldump
jest przesyłany potokowo do bzip2, który następnie przekierowuje dane wyjściowe do pliku.źródło
bzcat mydb.dump.bz2 | mysql <options>
.Oto przykład, którego używam w mojej pracy z wieloma potokami w jednym poleceniu. Używa gawk do przeszukiwania ogólnego dziennika zapytań MySQL ($ OFILE) i znajdowania wszelkich odmówionych logowań. Następnie sortuje tę listę według nazwy, potokuje tę listę do uniq, która liczy wystąpienia, a następnie potokuje sortowanie po raz ostatni, aby posortować zliczoną listę numerycznie ...
źródło
Rury najlepiej działają z filtrami i tłumaczami
W ten sposób dane mogą przepływać z jednego programu do drugiego, co oznacza, że w żadnym momencie wszystkie dane nie muszą znajdować się w pamięci jednocześnie.
źródło
cat filename | less
jest okropnym zastosowaniem orurowania, ponieważ możesz to po prostu zrobićless filename
Oto przykład pipsów, których używam na co dzień (ale może też być złym przykładem):
ls -la | more -c
Odpowiedzi Scott Hoffman i NJSG są lepszymi przykładami.
źródło
Co powiesz na: wyszukiwanie wzoru i wyświetlanie ostatniego występującego wzoru?
Pokazuje, jak używać
tail
,sed
agrep
w kontekście rury, które mogą być budowane krok po kroku.źródło
wykonaj ten w dowolnym katalogu, w którym chcesz posortować analizę rozmiaru folderu (następnie przewiń w dół klawiszem END):
Sortiert nach Ordnergrösse
źródło
Oto przykład, którego użyłem do ustawienia zmiennej DISPLAY, gdy xauth nie było opcją ...
Pierwsze polecenie pobiera potrzebne dane, tj. Nazwę hosta lub adres IP. Drugie polecenie pobiera tylko te dane (ostatnie pole). Wreszcie ostatnie polecenie usuwa nawiasy z danych.
źródło
Pipowanie poleceń, którego możesz używać wszędzie tam, gdzie uważasz, że dane wyjściowe pierwszego polecenia mogą być podawane jako dane wejściowe do następnego.
Przykłady
przykład kota txt | grep {some_line} | awk {some_command}
Jest to po prostu koncepcja, że jeśli czujesz, że uruchomione polecenie może być wprowadzone przez inne polecenie, możesz je potokować.
źródło