Lectia 2: piping
Piping - posibilitatea ca datele de iesire a unui program sa fie redirectate ca date de intrare catre un alt program. Unul din principalele “selling-point-uri” ale UNIX-ului.
Primul t-shirt cu UNIX facut in 1976
http://www.mckusick.com/beastie/jpg/foglio.jpg
arata un Computer PDP11 la care Daemonii Unix-ului au grija de tzevile (Piping) care leaga diversele componente intre ele.
Echivalentul din Automator sunt sagetzelele care leaga actiunile intre ele.
Orice program unix are “Standard Input” - stdin - datele de intrare - ce ar primi de la tastatura si “Standard Output” - stdout - datele de iesire - ce ar scrie in mod normal pe ecran.
Pentru a “lega” 2 comenzi intre ele se foloseste (fireste) caracterul pipe | astfel: comanda1 | comanda2. Tot ce comanda1 ar fi scris pe ecran i se da comenzii2 ca si cum ar fi batut pe tastatura.
Alte caractere speciale folosite de piping sunt cele de redirectare > si <.
comanda1 > fisier va scrie in fisierul fisier tot ce ar fi pus in mod normal pe ecran. Asta se numeste redirectarea standard output-ului.
comanda1 < fisier va rula comanda1 avand ca intrare datele din fisier ca si cum ar fi batute de la tastatura. Asta se numeste (fireste) redirectarea standard input-ului.
In mod normal un > fisier va suprascrie fisierul fisier daca acesta exista. Daca dorim sa adaugam datele in continuare, trebuie folosit comanda1 >> fisier.
In continuare un mic shell script pentru facut un raport:
echo Raport Utilizare Disk Studenti> raport.txt
date >> raport.txt
echo ======== >> raport.txt
for i in /Users/Student*
do
echo -n Avem utilizati in kb:
du -sk $i
echo -n numarul de fisiere din director fiind:
ls $i/ | wc -l
done >> raport.txt
echo ======== >> raport.txt
Explicatii:
comanda date afiseaza data curenta
du este Disk Usage - spatiul utilizat pe disk de catre fisierele/directoarele pasate ca parametrii. Optiunea -s ii spune sa arate doar un sumar (altfel pentru un director el spune marimile la toate subdirectoarele - recursiv) iar -k ii spune sa arate o valoare in Kb
wc este Word Count - numara litere, cuvinte & linii din datele primite la intrare. -l ii spune sa numere doar liniile. ls | wc -l numara cate linii intoarce comanda ls - adica cate fisiere sunt in directorul respectiv.
echo tipareste pe standard output ce i se da ca parametrii pe linia de comanda si pune un Enter la sfarsit. flag-ul -n il face sa nu mai puna Enter la sfarsitul liniei.
Alte chestii mici si utile:
cat date.txt | sort > date_sortate.txt
Sortarea liniilor din fisierul date.txt in ordine alfabetica.
cat ia fisierul/ele primite pe linia de comanda si le scuipa pe standard output. Numele cat este o prescurtare de la conCATenate deoarece aceasta comanda se poate folosi pentru a concatena mai multe fisiere intre ele cat fila1 fila2 > filamare. Comanda de mai sus - pentru sortarea unui singur fisier - s-ar putea scrie si ca sort < date.txt > date_sortate.txt dar pentru mai multe fisiere gen cat date1.txt date2.txt date3.txt | sort > date_agragate_sortate.txt trebuie folosit cat
sort sorteaza ce vine pe stdin catre stdout. Implicit in ordine alfabetica dar se poate modifica cu flag-uri. Cum ar fi -n sa sorteze considerand ca prima coloana sunt numere (adica 3 inaintea lui 11 nu invers cum ar fi in ordine alfabetica) si -r ca sa sorteze in revers (de la z la a, 9 la 0)
du -sk * | sort -rn | head -5
Afiseaza primele 5 cele mai mari fisiere sau directoare din directorul curent si marimea lor in kb.
head si tail afiseaza primele sau ultimele 10 linii dintr-un fisier primit ca parametru sau din stdin daca nu primeste nici un fisier ca parametru pe linia de comanda. Flag-ul -numar afiseaza atatea linii in loc de 10. tail poate fi folosit pentru a vedea coada unui fisier care creste in timp real - cum ar fi log-ul de apache. dai un tail -f access_log intr-un terminal si vezi in timp real cine iti acceseaza serverul de web.
ls -l | more
- sau -
ls -l | less
Afiseaza pagina cu pagina o lista detaliata cu fisierele din directorul curent.
more afiseaza pe terminalul curent un fisier primit ca parametru sau stdin-ul pagina cu pagina - apasand Space - pentru citirea mai usoara.
less este versiunea GNU a lui more. less is more than more. Este mai destept ca more in sensul ca te poti “plimba” cu cursoarele sus/jos/stanga/dreapta nu doar pagina cu pagina.
Un ultim utilitar folosit pentru piping este putin cunoscutul tee - similar cu un racord T la o instalatie sanitara.
du -sk * | sort -rn | tee sizes.txt | head -5
Tee-ul va “scurge” datele de pe parcurs (adica lista completa cu toate marimile fisierelor) in fisierul sizes.txt, el trimitand tot ce vine pe stdin catre stdout dar facand o copie si in fisier.
Exista foarte multe utilitare mici si frumoase care fac lucruri utile cu stream-urile de date (un stream de date este ce circula printr-un pipe) si va voi prezenta cateva din ele in lectiile ce urmeaza.