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 -lispisuje 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
/tmpidu kroz pajp dowc -l - Poruka greške za
/nepostojiide 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 -lpošalje listu nateeteeupiše celu listu ulista.txt- I prosledi celu listu na
grep grepfiltrira i prikaže samo.shfajlove
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, zatimkomanda1 | komanda2, i tako dalje. Svaki put proveri da li izlaz izgleda kako očekuješ pre nego što dodaš sledeći korak.