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

U sistemu Linux, cevi omogućavaju da se komande u komandnoj liniji povežu i rade zajedno. Na taj način, složeni zadaci se mogu pojednostaviti, a produktivnost povećati. Suština je u kombinovanju jednostavnih komandi u jedan moćan tim. U ovom članku ćemo vam pokazati kako se to radi.

Ceve su svuda oko nas

Cevi su izuzetno korisna opcija komandne linije koja je prisutna u Linux i Unix operativnim sistemima. One se koriste na različite načine. Ukoliko pogledate bilo koji tekst o komandnoj liniji Linux-a, videćete da se cevi koriste vrlo često. Čak i na našem blogu, u svim člancima o Linux-u, cevi se koriste na ovaj ili onaj način.

Linux cevi omogućavaju izvršavanje radnji koje nisu podržane samom školjkom. Linux filozofija dizajna je zasnovana na ideji da imamo mnogo malih uslužnih programa koji obavljaju svoje specifične zadatke veoma dobro, bez nepotrebne funkcionalnosti. Ključ je u principu „uradi jednu stvar i uradi je dobro“. Tako, pomoću cevi, možemo spojiti više komandi u niz, gde izlaz jedne komande postaje ulaz za drugu. Svaka od tih komandi dodaje svoj talenat u tim i tako kreiramo pobedničku kombinaciju.

Jednostavan primer

Pretpostavimo da imamo direktorijum sa različitim tipovima datoteka. Naš cilj je da utvrdimo koliko ima datoteka određenog tipa u tom direktorijumu. Naravno, postoje i drugi načini da se ovo postigne, ali, radi ilustracije cevi, upotrebićemo upravo njih.

Listu datoteka možemo dobiti pomoću komande ls:

ls

Za izdvajanje određenog tipa datoteke, koristimo komandu grep. Želimo da pronađemo datoteke koje u svom nazivu ili ekstenziji sadrže reč „page“.

Koristićemo specijalni znak | za prosleđivanje izlaza komande ls kao ulaz u grep.

ls | grep "page"

grep ispisuje linije koje odgovaraju datom obrascu pretrage. Dakle, na ovaj način dobijamo listu koja sadrži samo „.page“ datoteke.

Čak i ovaj jednostavan primer pokazuje funkcionalnost cevi. Izlaz komande ls nije prosleđen u terminal, već je poslat komandi grep kao ulazni podatak. Izlaz koji vidimo potiče od komande grep, koja je poslednja u nizu.

Proširivanje lanca

Hajde da proširimo naš niz komandi. Možemo prebrojati „.page“ datoteke dodavanjem komande wc. Koristićemo opciju -l (broj linija) sa wc. Obratite pažnju da smo dodali i opciju -l (dugačak format) u komandu ls. To će nam biti potrebno kasnije.

ls -l | grep "page" | wc -l

grep više nije poslednja komanda u nizu, tako da ne vidimo njen izlaz. Izlaz grep-a se prosleđuje kao ulaz u komandu wc. Izlaz koji se prikazuje u terminalu dolazi od komande wc. Ona nam javlja da u direktorijumu postoji 69 „.page“ datoteka.

Nastavimo dalje. Zamenićemo komandu wc sa awk. Izlaz komande ls -l ima devet kolona. Pomoću komande awk, ispisaćemo kolone pet, tri i devet. To su veličina, vlasnik i naziv datoteke.

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

Dobijamo listu pomenutih kolona za svaku od pronađenih datoteka.

Sada ćemo ovaj izlaz proslediti kroz komandu sort. Koristićemo opciju -n (numerički) kako bi komanda sort prvu kolonu tretirala kao brojeve.

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

Izlaz je sada sortiran po veličini datoteke, uz prikaz našeg prilagođenog izbora od tri kolone.

Dodavanje još jedne komande

Za kraj, dodajmo i komandu tail. Reći ćemo joj da prikaže poslednjih pet linija izlaza.

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

To znači da se naša komanda prevodi u nešto poput „prikaži mi pet najvećih „.page“ datoteka u ovom direktorijumu, sortiranih po veličini.“ Naravno, ne postoji jedna komanda koja to radi, ali pomoću cevi smo kreirali našu vlastitu. Ovu, ili bilo koju drugu dugačku komandu, možemo sačuvati kao alias ili shell funkciju kako ne bismo morali sve da kucamo.

Evo izlaza:

Možemo obrnuti redosled veličina dodavanjem opcije -r (reverse) u komandu sort, i koristiti head umesto tail za odabir linija sa vrha izlaza.

Ovog puta je lista pet najvećih „.page“ datoteka prikazana od najveće ka najmanjoj:

Neki noviji primeri

Evo dva zanimljiva primera iz nedavnih članaka.

Neke komande, kao što je xargs, su dizajnirane da primaju ulaz. Evo kako možemo koristiti wc za brojanje reči, znakova i redova u više datoteka, tako što šaljemo izlaz ls u xargs, koji zatim šalje listu naziva datoteka u wc kao da su prosleđeni direktno komandi wc.

ls *.page | xargs wc

Ukupan broj reči, znakova i redova je prikazan na dnu terminala.

Evo načina da dobijemo sortiranu listu jedinstvenih ekstenzija datoteka u trenutnom direktorijumu, sa brojem svakog tipa.

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

Ovde se mnogo toga dešava.

ls: Prikazuje datoteke u direktorijumu.
rev: Obrće tekst u nazivima datoteka.
cut: Odseca tekst kod prvog pojavljivanja graničnika „.“. Tekst nakon toga se odbacuje.
rev: Obrće preostali tekst, koji je ekstenzija naziva datoteke.
sort: Sortira listu po abecednom redu.
uniq: Broji broj jedinstvenih unosa na listi.

Izlaz prikazuje listu ekstenzija datoteka, sortiranih po abecednom redu, sa brojem svakog jedinstvenog tipa.

Imenovane cevi

Postoji još jedna vrsta cevi koja nam je dostupna, a to su imenovane cevi. Cevi u prethodnim primerima su kreirane „u letu“ od strane shell-a, kada obraduje komandnu liniju. One se kreiraju, koriste, a zatim se odbacuju. To su privremeni objekti i ne ostavljaju nikakav trag o sebi. Postoje samo dok traje komanda koja ih koristi.

Imenovane cevi se pojavljuju kao trajni objekti u sistemu datoteka, tako da ih možete videti pomoću komande ls. One su postojane jer će preživeti restart računara – iako će svi nepročitani podaci u njima u tom trenutku biti odbačeni.

Imenovane cevi su se mnogo koristile da bi se omogućilo različitim procesima da šalju i primaju podatke, ali ih danas ređe viđamo. Nema sumnje da još uvek postoje oni koji ih koriste vrlo efikasno, ali su retke. Ipak, radi kompletnosti, evo kako ih možete koristiti.

Imenovane cevi se kreiraju pomoću komande mkfifo. Ova komanda će kreirati imenovanu cev pod nazivom „geek-pipe“ u trenutnom direktorijumu.

mkfifo geek-pipe

Detalje imenovane cevi možemo videti ako koristimo komandu ls sa opcijom -l (dugačak format):

ls -l geek-pipe

Prvi znak u listi je „p“, što znači da je to cev. Da je „d“, to bi značilo da je objekat sistem datoteka direktorijum, a crtica „-“ bi značila da je to obična datoteka.

Korišćenje imenovane cevi

Hajde da koristimo našu cev. Neimenovane cevi, koje smo koristili u prethodnim primerima, prosleđuju podatke odmah, od komande koja šalje, do komande koja prima. Podaci poslati putem imenovane cevi ostaju u cevi dok se ne pročitaju. Podaci se zapravo čuvaju u memoriji, tako da veličina imenovane cevi ne varira u ls listi, bez obzira da li u njoj ima podataka ili ne.

Koristićemo dva terminala za ovaj primer. Jedan ćemo obeležiti sa:

# Terminal-1

a drugi sa:

# Terminal-2

Tako ćete ih lakše razlikovati. Simbol „#“ govori shell-u da je ono što sledi komentar i da ga ignoriše.

Uzmimo ceo naš prethodni primer i preusmerimo ga u imenovanu cev. Dakle, koristimo i neimenovane i imenovane cevi u jednoj komandi:

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

Izgleda kao da se ništa ne dešava. Možda ćete primetiti da se ne vraćate u komandnu liniju, dakle, ipak se nešto događa.

U drugom terminalu unesite ovu komandu:

cat < geek-pipe

Preusmeravamo sadržaj imenovane cevi u cat, tako da će cat prikazati taj sadržaj u drugom terminalu. Evo izlaza:

Videćete da ste se vratili u komandnu liniju u prvom terminalu.

Dakle, šta se tačno dogodilo?

Preusmerili smo izlaz u imenovanu cev.
Prvi terminal se nije vratio u komandnu liniju.
Podaci su ostali u cevi dok se nisu pročitali iz cevi u drugom terminalu.
Vratili smo se u komandnu liniju u prvom terminalu.

Možda mislite da biste mogli pokrenuti komandu u prvom terminalu kao pozadinski zadatak dodavanjem & na kraj komande. I bili biste u pravu. U tom slučaju bismo se odmah vratili u komandnu liniju.

Poenta je da, prikazom kako se ne koristi pozadinski rad, naglasimo da je imenovana cev blokirajući proces. Postavljanje nečega u imenovanu cev otvara samo jedan kraj cevi. Drugi kraj se ne otvara dok program za čitanje ne preuzme podatke. Kernel zaustavlja proces u prvom terminalu dok se podaci ne pročitaju sa drugog kraja cevi.

Snaga cevi

Danas, imenovane cevi su pomalo novina.

S druge strane, obične, dobre stare Linux cevi su jedan od najkorisnijih alata koje možete imati u svom arsenalu u terminalu. Linux komandna linija počinje da živi za vas i dobijate potpuno novu snagu kada možete da organizujete kolekciju komandi i kreirate jedinstvenu celinu.

Savet: Najbolje je da pišete komande koje se prenose, tako što dodajete jednu po jednu komandu, i prvo proverite da li taj deo radi, a zatim dodajte sledeću komandu.