Како користити цеви на Линук-у

Користите Линукс цеви за кореографију како услужни програми командне линије сарађују. Поједноставите сложене процесе и повећајте своју продуктивност тако што ћете искористити колекцију самосталних команди и претворити их у јединствен тим. Показаћемо вам како.

Цеви су свуда

Пипес су једна од најкориснијих функција командне линије које имају Линук и Уник оперативни системи. Цеви се користе на безброј начина. Погледајте било који чланак командне линије за Линук — на било којој веб локацији, не само на нашој — и видећете да се цеви појављују чешће него не. Прегледао сам неке од чланака о Линук-у Хов-То Геек-а и у свима се користе цеви, на овај или онај начин.

Линук цеви вам омогућавају да извршите радње које нису подржане од стране шкољка. Али зато што је филозофија дизајна Линук-а да има много малих услужних програма који обављају своје посвећена функција веома добро, и без непотребне функционалности — мантре „уради једну ствар и уради то добро“ — можете саставити низове команди заједно са цевима тако да излаз једне команде постане улаз друге. Свака команда коју унесете доноси тиму свој јединствени таленат и ускоро ћете открити да сте окупили победнички тим.

Једноставан пример

Претпоставимо да имамо директоријум пун много различитих типова датотека. Желимо да знамо колико датотека одређеног типа има у том директоријуму. Постоје и други начини да се то уради, али циљ ове вежбе је увођење цеви, тако да ћемо то урадити са цевима.

Листу датотека можемо лако добити користећи лс:

ls

Да бисмо издвојили тип датотеке од интереса, користићемо греп. Желимо да пронађемо датотеке које имају реч „страница“ у називу или екстензији датотеке.

Користићемо специјални знак љуске „|” за превођење излаза из лс-а у греп.

ls | grep "page"

лс -л |  греп

греп исписује линије које одговара његовом обрасцу претраге. Дакле, ово нам даје листу која садржи само датотеке „.паге“.

Чак и овај тривијални пример показује функционалност цеви. Излаз из лс-а није послат у прозор терминала. Послат је греп-у као податак за рад са командом греп. Излаз који видимо долази од греп, што је последња команда у овом ланцу.

Проширујемо наш ланац

Почнимо да ширимо наш ланац цевоводних команди. Ми Можемо пребројите датотеке „.паге“. додавањем команде вц. Користићемо опцију -л (број линија) са вц-ом. Имајте на уму да смо такође додали опцију -л (дуги формат) у лс. Ускоро ћемо ово користити.

ls - | grep "page" | wc -l

лс - |  греп

греп више није последња команда у ланцу, тако да не видимо њен излаз. Излаз из греп-а се уноси у команду вц. Излаз који видимо у прозору терминала је из вц-а. вц извештава да постоји 69 датотека „.паге“ у директоријуму.

  Како да отпремите и делите датотеке са Линук терминала помоћу Трансфер.сх

Хајде да поново продужимо ствари. Скинућемо команду вц са командне линије и заменити је са авк. Постоји девет колона у излазу из лс-а са опцијом -л (дуги формат). Користићемо авк да штампа колоне пет, три и девет. Ово су величина, власник и назив датотеке.

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

Добијамо листу тих колона, за сваку од одговарајућих датотека.

Сада ћемо тај излаз проследити кроз команду сортирања. Користићемо опцију -н (нумеричку) да бисмо сортирали знали да прва колона треба да буде третирају као бројеви.

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

Излаз је сада сортиран по величини датотеке, са нашим прилагођеним избором од три колоне.

Додавање друге команде

Завршићемо додавањем команде таил. Рећи ћемо му да наведе последњих пет излазних линија само.

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

То значи да се наша команда преводи у нешто попут „покажи ми пет највећих „.паге“ датотека у овом директоријуму, пореданих по величини.“ Наравно, не постоји наредба да се то постигне, али користећи цеви, ми смо креирали сопствену. Могли бисмо додати ову — или било коју другу дугу команду — као псеудоним или функцију љуске да бисмо сачували све куцање.

Ево излаза:

Могли бисмо да обрнемо редослед величине додавањем опције -р (обрнуто) у команду сортирања и коришћењем главе уместо репа за одабир линија са врха излаза.

Овог пута пет највећих датотека „.паге“ су наведене од највеће до најмање:

Неки недавни примери

Ево два занимљива примера из недавних чланака о геек-у.

Неке команде, као што је каргсцомманд, су дизајниране да им се доведе улаз. Ево начина на који можемо имати вц да броји речи, знакови и редови у више датотека, слањем лс у каргс који затим шаље листу имена датотека вц-у као да су прослеђени вц-у као параметри командне линије.

ls *.page | xargs wc

Укупан број речи, знакова и редова је наведен на дну прозора терминала.

  Како инсталирати Нектцлоуд клијент синхронизације на Линук

Ево начина да добијете сортирану листу јединствених екстензија датотека у тренутном директоријуму, са бројем сваког типа.

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

Овде се много тога дешава.

лс: Наводи датотеке у директоријуму
рев: Преокреће текст у називима датотека.
резати: Пресече конце при првом појављивању наведеног граничника „.“. Текст након овога се одбацује.
рев: Преокреће преостали текст, који је екстензија имена датотеке.
сортирај: сортира листу по абецедном реду.
уник: Броји број сваког од њих јединствени унос на листи.

Излаз приказује листу екстензија датотека, сортираних по абецедном реду са бројем сваког јединственог типа.

Именоване цеви

Постоји још једна врста цеви која нам је доступна, која се зове именоване цеви. Цеви у претходним примерима су креиране у ходу од стране љуске када обрађује командну линију. Цеви се креирају, користе, а затим одбацују. Они су пролазни и не остављају никакав траг о себи. Они постоје само док је наредба која их користи покренута.

Именоване цеви се појављују као трајни објекти у систему датотека, тако да их можете видети помоћу лс. Они су упорни јер ће преживети поновно покретање рачунара—иако ће сви непрочитани подаци у њима у том тренутку бити одбачени.

Именоване цеви су се много користиле у једном тренутку да би се омогућило различитим процесима да шаљу и примају податке, али их дуго нисам видео да се користе на тај начин. Нема сумње да постоје људи који их још увек користе са великим ефектом, али нисам их недавно срео. Али ради комплетности, или само да бисте задовољили своју радозналост, ево како их можете користити.

Именоване цеви се креирају командом мкфифо. Ова команда ће креирати именовану цев под називом „геек-пипе“ у тренутном директоријуму.

mkfifo geek-pipe

Можемо видети детаље именоване цеви ако користимо команду лс са опцијом -л (дуги формат):

ls -l geek-pipe

Први знак листе је „п“, што значи да је то цев. Да је „д“, то би значило да је објекат система датотека директоријум, а цртица „-“ би значила да је то обична датотека.

Коришћење именоване цеви

Хајде да користимо нашу цев. Неименоване цеви које смо користили у нашим претходним примерима прослеђивале су податке одмах из команде за слање у команду за пријем. Подаци послати преко именоване цеви остаће у цеви док се не прочитају. Подаци се заправо чувају у меморији, тако да величина именоване цеви неће варирати у лс листи без обзира да ли постоје подаци у њој или не.

  Како организовати своје породично стабло на Линук-у са Грампс-ом

Користићемо два прозора терминала за овај пример. Користићу ознаку:

# Terminal-1

у једном прозору терминала и

# Terminal-2

у другом, тако да их можете разликовати. Хеш „#“ говори љусци да је оно што следи коментар и да га игнорише.

Узмимо цео наш претходни пример и преусмеримо га у именовану цев. Дакле, користимо и неименоване и именоване цеви у једној команди:

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

лс |  рев |  цут -д'.'  -ф1 |  рев |  сортирати |  уник -ц > геек-пипе у прозору терминала” видтх=”646″ хеигхт=”97″ онлоад=”пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);”  онеррор=”тхис.онеррор=нулл;пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);”></п> <п>Изгледа да се неће десити ништа много.  Можда ћете приметити да се не враћате у командну линију, тако да се нешто дешава.</п> <п>У другом прозору терминала, издајте ову команду:</п> <пре>цат < геек- пипе</пре> <п><имг срц=

Преусмеравамо садржај именоване цеви у цат, тако да ће мачка приказати тај садржај у другом прозору терминала. Ево излаза:

И видећете да сте враћени на командну линију у првом прозору терминала.

Дакле, шта се управо догодило.

Преусмерили смо неки излаз у именовану цев.
Први прозор терминала се није вратио у командну линију.
Подаци су остали у цеви док се не прочитају из цеви у другом терминалу.
Били смо враћени на командну линију у првом прозору терминала.

Можда мислите да бисте могли да покренете команду у првом прозору терминала као позадински задатак додавањем & на крај команде. И био би у праву. У том случају бисмо одмах били враћени у командну линију.

Смисао некоришћења позадинске обраде је да се истакне да је именована цев процес блокирања. Стављање нечега у именовану цев отвара само један крај цеви. Други крај се не отвара све док програм за читање не издвоји податке. Кернел суспендује процес у првом прозору терминала док се подаци не прочитају са другог краја цеви.

Моћ цеви

Данас су именоване луле нешто као новина.

С друге стране, обичне старе Линук цеви су један од најкориснијих алата које можете имати у комплету алата за прозор терминала. Линук командна линија почиње да оживљава за вас, а ви добијате потпуно ново појачање када можете оркестрирати колекцију команди да бисте произвели једну кохезивну изведбу.

Наговештај за раздвајање: Најбоље је да пишете команде које се преносе тако што ћете додати једну по једну команду и покренути тај део да ради, а затим убацити следећу команду.