Gym
lesson

Pajpovi

Cilj učenja: Nakon ove lekcije znaš da koristiš operator | da povežeš više komandi u lanac, razumeš Unix filozofiju malih alata i možeš da sastaviš složenu obradu podataka od jednostavnih delova.


Šta je pajp?

Pajp (pipe, |) je operator koji preusmeri stdout jedne komande direktno na stdin sledeće — bez privremenog fajla. Komande rade paralelno, podaci teku između njih u realnom vremenu.

komanda_a | komanda_b

stdout od komanda_a → stdin od komanda_b


Unix filozofija

Pajpovi su srce Unix filozofije, formulisane još 1978. godine:

"Napiši programe koji rade jednu stvar, i rade je dobro. Napiši programe koji rade zajedno. Napiši programe koji obrađuju tekstualne tokove, jer je to univerzalni interfejs." — Doug McIlroy, Bell Labs

Umesto jednog velikog programa koji sve radi, Unix nudi mali skup alata koji se kombinuju:

Alat Radi jednu stvar
cat Čita fajl i ispisuje sadržaj
grep Filtrira linije prema uzorku
sort Sortira linije
uniq Uklanja duplikate (uzastopne)
wc Broji reči, linije, karaktere
head Prikazuje prvih N linija
tail Prikazuje poslednjih N linija
cut Izdvaja kolone
tr Prevodi/briše karaktere
awk Obrađuje kolone i redove
sed Pretražuje i menja tekst

Svaki od ovih alata je skoro beskoristan sam — ali zajedno, kroz pajpove, čine moćan sistem obrade podataka.


Osnovna sintaksa

komanda1 | komanda2

Primer:

ls -l | grep ".txt"
  • ls -l ispisuje sve fajlove sa detaljima (stdout)
  • Shell taj stdout poveže sa stdin od grep
  • grep ".txt" filtrira i ispisuje samo linije koje sadrže .txt

Lanac pajpova

Možeš povezati koliko god hoćeš komandi:

komanda1 | komanda2 | komanda3 | komanda4

Svaka komanda obrađuje izlaz prethodne.

Primer — nađi 5 najčešćih reči u fajlu:

cat tekst.txt | tr ' ' '
' | sort | uniq -c | sort -rn | head -5

Rastavimo korak po korak:

cat tekst.txt         → ispiši sadržaj fajla
  | tr ' ' '
'       → zameni svaki razmak novim redom (svaka reč = red)
  | sort              → sortiraj reči abecedno
  | uniq -c           → prebrojaj uzastopne duplikate (dobijamo "5 reč")
  | sort -rn          → sortiraj numerički, opadajuće (najveći broj prvi)
  | head -5           → uzmi prvih 5

Ovo je ono sto bi u nekom programskom jeziku zauzelo desetine linija — ovde stane u jednu.


Praktični primeri

Filtriranje procesa

ps aux | grep nginx

Prikaži samo procese koji sadrže "nginx" u svom imenu.

Brojanje fajlova

ls /etc | wc -l

Koliko fajlova ima u /etc?

Pronađi aktivne korisnike

who | cut -d' ' -f1 | sort | uniq

Koji su korisnici trenutno ulogovani (bez duplikata)?

Pretraži istoriju komandi

history | grep "git" | tail -20

Poslednjih 20 git komandi koje si pokrenuo/la.


Pajpovi i stderr

Pajp prenosi samo stdout. stderr prolazi direktno na ekran.

ls /tmp /nepostoji | wc -l
  • Linije iz /tmp idu kroz pajp do wc -l
  • Poruka greške za /nepostoji ide direktno na ekran (nije prebrojana)

Ako hoćeš da i greške idu kroz pajp:

ls /tmp /nepostoji 2>&1 | wc -l

Sada se i greška broji kao linija.


tee — pajp sa kopijom

Komanda tee čita stdin, piše na stdout i istovremeno upisuje u fajl. Korisno kada hoćeš i da vidiš izlaz i da ga sačuvaš.

ls -l | tee lista.txt | grep ".sh"
  • ls -l pošalje listu na tee
  • tee upiše celu listu u lista.txt
  • I prosledi celu listu na grep
  • grep filtrira i prikaže samo .sh fajlove
ls -l ──► tee ──┬──► lista.txt   (kopija: cela lista sacuvana u fajl)
                │
                └──► grep ".sh" ──► ekran   (filtrirano: samo .sh fajlovi)

# Legenda:
#   ──►  tok podataka (svi podaci idu u oba pravca istovremeno)
#   tee  prima stdin, kopira ga i na stdout i u fajl

Preusmeravanje + pajpovi zajedno

Pajpovi i preusmeravanje se mogu kombinovati:

# Čitaj iz fajla, obradi, sačuvaj rezultat
grep "Beograd" korisnici.txt | cut -d',' -f1 > beogradjani.txt

# Pretraži, sačuvaj greške odvojeno, rezultate u fajl
find / -name "*.conf" 2> greske.txt | grep "nginx" > nginx-konf.txt

Savet: Kada sastaviš dugačak lanac pajpova, gradi ga postepeno — prvo pokreni komanda1, zatim komanda1 | komanda2, i tako dalje. Svaki put proveri da li izlaz izgleda kako očekuješ pre nego što dodaš sledeći korak.