Користите Линук цеви да бисте кореографирали како наредбену линијукомуналије сарађују. Поједноставите сложене процесе и повећајте своју продуктивност тако што ћете прикупити самосталне команде и претворити их у јединствени тим. Показаћемо вам како.
Цеви су свуда
Цеви су једна од најкориснијих командних линијафункције које имају Линук и Уник оперативни системи. Цеви се користе на безброј начина. Погледајте било који чланак Линук командне линије - на било којој веб локацији, не само нашој - и видећете да цеви чешће наступе. Прегледао сам неке од чланака како се Геек-ови Геек-ови Линук и цеви користе у свим њима, на овај или онај начин.
Линук цеви вам омогућавају да изводите акције које јесуније подржан од стране кутије од стране кутије. Али с обзиром да је филозофија дизајна Линук-а имати много малих услужних програма који врло добро обављају своју наменску функцију и без непотребне функционалности - мантре „уради једно и уради добро“ - можете жвакати низове команди заједно са цевима тако да излаз једне наредбе постају улаз друге. Свака команда коју доделите унесе свој јединствени таленат у тим и убрзо откријете да сте саставили победнички одред.
Једноставан пример
Претпоставимо да имамо директориј пун многихразличите врсте датотека. Желимо знати колико датотека одређене врсте се налази у том директорију. Постоје други начини за то, али циљ ове вежбе је увођење цеви, тако да ћемо то урадити и са цевима.
Лако можемо добити списак датотека ls
:
ls
Да бисмо издвојили врсту датотеке која нас занима, користићемо grep
. Желимо да пронађемо датотеке које имају назив „страница“ у називу датотеке или у продужетку датотеке.
Користићемо посебан знак шкољке “|
„Да би се произвео излаз из ls
у grep
.
ls | grep "page"
grep
штампа линије које одговарају његовом обрасцу претраге. То нам даје списак који садржи само „.паге“ датотеке.
Чак и овај тривијални пример приказује функционалност цеви. Излаз из ls
није послан у прозор терминала. Послано је grep
као подаци за grep
наредба за рад. Излаз који видимо долази од нас grep,
која је последња команда у овом ланцу.
Проширење нашег ланца
Кренимо да проширимо наш ланац пипед команди. Датотеке „.паге“ можемо пребројати додавањем wc
команда. Користићемо -l
(број линија) са wc
. Напомињемо да смо такође додали -l
(дуги формат) опција за ls
. Ускоро ћемо то користити.
ls - | grep "page" | wc -l
grep
више није задња наредба у ланцу, тако да не видимо његов излаз. Излаз из grep
се уноси у wc
команда. Излаз из којег видимо у прозору терминала је wc
. wc
извештава да у директорију има 69 „.паге“ датотека.
Хајде да продужимо ствари поново. Ми ћемо узети wc
наредбу искључите из командне линије и замените је awk
. На излазу је девет колона ls
са -l
(дуги формат) опција. Користићемо awk
за штампање колона пет, три и девет. Ово су величина, власник и име датотеке.
ls -l | grep "page" | awk '{print $5 " " $3 " " $9}'
Добијамо листу тих колона за сваку од датотека које одговарају.
Сада ћемо тај излаз пренети кроз sort
команда. Користићемо -n
(нумеричка) опција за пустити sort
знам да би први ступац требало третирати као бројеве.
ls -l | grep "page" | awk '{print $5 " " $3 " " $9}' | sort -n
Излаз је сортиран према величини датотеке, уз наш прилагођени избор три колоне.
Додавање друге команде
Завршићемо додавањем у tail
команда. Рећи ћемо му да наведе само пет последњих редова.
ls -l | grep "page" | awk '{print $5 " " $3 " " $9}' | sort -n | tail -5
То значи да наша наредба значи нештопопут „покажи ми пет највећих„ .паге “датотека у овом директорију, пореданих по величини.“ Наравно, не постоји команда да то постигнемо, али користећи цеви, створили смо своју. Могли бисмо додати ову - или било коју другу дугу команду - као псеудоним или функцију љуске да сачувамо све куцање.
Ево резултата:
Могли бисмо да поништимо редослед величине додавањем -r
(обрнуто) опцију на sort
команде и употребе head
уместо tail
да одаберете линије с врха резултата.
Овог пута је наведено пет највећих „.паге“ датотека од највећих до најмањих:
Неки новији примери
Ево два занимљива примера из недавних чланака о Хов-То геековима.
Неке команде, попут xargs
команде, дизајниране су тако да имају улазни цевовод за њих. Ево начина на који можемо wc
пребројите речи, карактере и редове у више датотека цевоводом ls
у xargs
која затим уноси списак датотека wc
као да су им пренесени wc
као параметре командне линије
ls *.page | xargs wc
Укупни број речи, знакова и линија наведен је на дну прозора терминала.
Ево начина да се сортира листа јединствених екстензија датотека у тренутном директорију, са бројем сваке врсте.
ls | rev | cut -d'.' -f1 | rev | sort | uniq -c
Овдје се пуно тога догађа.
- лс: Листа датотека у директорију
- рев: Обрне текст у називима датотека.
- исећи: Сече низ при првом појављивању наведеног разграничника ".". Текст након тога се одбацује.
- рев: Поништава преостали текст, који је проширење имена датотеке.
- врста: Списује листу абецедним редом.
- уник: Броји број сваког јединственог уноса на листи.
Излаз приказује листу екстензија датотека, пореданих по абецеди са бројем сваке јединствене врсте.
Намед Пипес
Доступна нам је друга врста цеви,називају се цеви. Цеви у претходним примерима су креиране у покрету помоћу љуске приликом обраде командне линије. Цеви се стварају, користе и затим одбацују. Они су пролазни и не остављају трага о себи. Они постоје само онолико дуго колико траје наредба која их користи.
Називне цијеви се појављују као трајни објекти у датотечном суставу, тако да их можете видјети користећи ls
. Они су упорни јер ће преживети поновно покретање рачунара - мада ће тада сви непрочитани подаци у њима бити одбачени.
Називне цеви су коришћене много пута да се то дозволиразличите процесе слања и примања података, али дуго их нисам видео да се користе на тај начин. Без сумње постоје људи који их још увек користе како би имали сјајан ефекат, али недавно се нисам срео. Али због потпуности или само да бисте удовољили вашој радозналости, ево како их можете користити.
Називне цеви су створене помоћу mkfifo
команда. Ова наредба ће створити именовану цев која се у тренутном директорију назива "геек-пипе".
mkfifo geek-pipe
Можете видети детаље именоване цеви ако користимо ls
команда са -l
(дуги формат) опција:
ls -l geek-pipe
Први знак листе је "п", што значи да је цев. Ако је то било „д“, то би значило да је објект датотечног система директориј, а цртица „-“ би значила да је то редовна датотека.
Коришћење именоване цеви
Користимо нашу цев. Неименоване цеви које смо користили у нашим претходним примерима пренели су податке одмах из наредбе за слање у наредбу за пријем. Подаци послати кроз именовану цев остат ће у цијеви док се не прочитају. Подаци се заправо чувају у меморији, тако да величина именоване цеви неће варирати у ls
уноси да ли у њему има података или не.
За овај пример користићемо два терминална прозора. Користићу ознаку:
# Terminal-1
у једном прозору терминала и
# Terminal-2
у другом, тако да их можете разликовати. Хасх "#" говори шкољци да је оно што следи је коментар и да га игнорише.
Узмимо целину нашег претходног примера и преусмеримо га у именовану цев. Зато користимо и неименоване и именоване цеви у једној наредби:
ls | rev | cut -d'.' -f1 | rev | sort | uniq -c > geek-pipe
Чини се да се ништа велико неће догодити. Можда ћете приметити да се не враћате у наредбени редак, па се нешто дешава.
У другом прозору терминала издајте ову наредбу:
cat < geek-pipe
Преусмеравамо садржај именоване цеви у cat
, тако да cat
ће приказати тај садржај у другом прозору терминала. Ево резултата:
И видећете да сте враћени у наредбени редак у првом прозору терминала.
Дакле, шта се управо догодило
- Преусмерили смо неки излаз у именовану цев.
- Први прозор терминала се није вратио у наредбени редак.
- Подаци су остали у цеви док нису прочитани из цеви на другом терминалу.
- Враћени су нам у наредбени редак у првом прозору терминала.
Можда мислите да бисте могли извршити наредбу у првом прозору терминала као позадински задатак додавањем ан &
до краја команде. И у праву си У том случају би нас одмах вратили у командни редак.
Поента не коришћење позадинске обраде требало је да се истакне да је именована цев процес блокирања. Стављање нечега у именовану цев се само отвараједан крај цеви. Други крај се не отвара док програм за читање не извуче податке. Кернел зауставља процес у првом прозору терминала док се подаци не прочитају са другог краја цеви.
Моћ цеви
У данашње време именоване цеви су нешто новост.
Обичне старе Линук цеви, са друге стране, су једноод најкориснијих алата које можете имати у алату прозора вашег терминала. Линук наредбена линија почиње да вам оживљава, а ви добијате потпуно ново напајање када можете оркестрирати колекцију команди да бисте произвели једну кохезивну перформансу.
Савет о одвајању: Најбоље је да напишете своје пипед команде додавањем једне команде у исто време и приметите тај део да ради, а затим пређите на следећу наредбу.