= Filtre de text = [[https://docs.google.com/presentation/d/1btwpQIcgu5F9Upw0EKD7ufhzgLycuacE3q07N-_f_6w/pub?start=false&loop=false&delayms=3000|Slide-uri de prezentare]] == Tutorial == Pentru tutorial, vom folosi următorul text: root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh games:x:5:60:games:/usr/games:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh www-data:x:33:33:www-data:/var/www:/bin/sh irc:x:39:39:ircd:/var/run/ircd:/bin/sh nobody:x:65534:65534:nobody:/nonexistent:/bin/sh gdm:x:106:114:Gnome Display Manager:/var/lib/gdm:/bin/false kernoops:x:108:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false ieu:x:1000:1000:ieu,,,:/home/ieu:/bin/bash * Copiați textul de mai sus și salvați-l într-un fișier numit ''passwd'' aflat în directorul home al utilizatorului ''student''. ** Fișierul are o structură asemănătoare ''/etc/passwd'' (informații despre utilizatorii sistemului) *** nume utilizator *** dacă parola este în ''/etc/shadow'' criptată *** UID, GID *** informații auxiliare *** care este directorul ''home'' al utilizatorului *** shell-ul implicit al utilizatorului === cat, tac, nl === * Folosiți comanda ''cat'' pentru a afișa conținutul fișierului ''passwd''. * Căutați în ''man'' un parametru astfel încât să numerotați linile din output. ** Folosiți o metodă care numără inclusiv linile albe. ** Folosiți o altă metodă care nu numerotează linile albe. * Rulați comanda tac passwd ** Ce observați? * Rulați comanda nl passwd ** Cu ce este echivalentă? (''cat'' + ce parametru?) === head, tail === * Rulați comanda head passwd ** Ce afișează? * Rulați comanda cat passwd | head ** Ce afișează? * Rulați comanda cat -n passwd | head ** Ce afișează? Vom folosi combinația ''cat -n'' și operatorul ''|'' (pipe) pentru a simplifica înțelegerea output-ului. * Rulați comanda cat -n passwd | head -n 4 ** Ce afișează? * Rulați comanda cat -n passwd | head -n +4 ** Ce afișează? * Rulați comanda cat -n passwd | head -n -4 ** Ce afișează? * Rulați comanda cat -n passwd | tail ** Ce afișează? * Rulați comanda cat -n passwd | tail -n 4 ** Ce afișează? * Rulați comanda cat -n passwd | tail -n -4 ** Ce afișează? * Rulați comanda cat -n passwd | tail -n +4 ** Ce afișează? * Rulați comanda cat -n passwd | head -n 6 | tail -n 2 ** Încercați să înțelegeți output-ul. === sort, uniq === * Rulați comanda cat passwd | sort ** Ce observați? * Căutați în ''man'' un parametru pentru ''sort'' astfel încât sortarea să se facă în ordine inversă. * Rulați comanda cat passwd | uniq ** Redirectați output-ul într-un fișier numit ''1st''. * Rulați comanda cat passwd | sort | uniq ** Redirectați output-ul într-un fișier numit ''2nd''. Ce este diferit între 1st și 2nd? * Folosiți comanda ''wc'' pentru a vedea câte linii are fiecare fișier. ** Ce s-a întâmplat cu linile goale? === cut, tr === * Rulați comanda cat passwd * Rulați comanda cat passwd | cut -d':' -f1 ** Ce observați? * Rulați comanda cat passwd | cut -d':' -f5 ** Ce observați? * Rulați comanda cat passwd | cut -d':' -f6 ** Ce observați? * Rulați comanda cat passwd | cut -d':' -f1,5,6 ** Ce observați? * Rulați comanda cat passwd * Rulați comanda cat passwd | tr 'x' 'X' ** Ce s-a întâmplat? * Rulați comanda cat passwd | tr 'ieu' 'IEU' ** Ce observați? * Rulați comanda cat passwd | tr 'ieu' 'IE' ** Ce observați? * Rulați comanda cat passwd | tr 'ieu' 'I' ** Ce observați? * Rulați comanda cat passwd | tr -d 'x' ** Ce observați? * Rulați comanda cat passwd | tr -d 'home' ** Ce observați? * Rulați comanda cat passwd | tr -s o ** Ce observați? (ceva mai observabil pe prima linie prima linie) === grep === * Rulați comanda cat passwd | grep 'var' ** Ce observați? * Rulați comanda cat passwd | grep -v 'var' ** Ce observați? * Rulați comanda cat passwd | grep '^r' ** Ce observați? * Rulați comanda cat passwd | grep 'h$' ** Ce observați? * Rulați comanda cat passwd | grep '^i.*h$' ** Ce observați? * Rulați comanda cat passwd | grep ^[r,i] ** Ce observați? === sed === **sed** este un **stream editor**. Cel mai bine cunoscut pentru funcția de search and replace. sed 's/foo/bar/g' in_file > out_file Se poate adăuga parametrul ''-i'' pentru editare "in place" a fișierului: sed -i 's/foo/bar/g' in_file Înlocuirea se poate face prin expresii regulate: sed -i 's/\^first/First/g' file sed -i 's/[0-9]/X/g' file În general, sintaxa se referă la o adresă (linii selectate) și la o acțiune asupra acelor linii: # Pentru fiecare linie din text, dacă este între linia 3 și 4, printeaza-o; ignoră restul liniilor sed -n '3,4p' foo.txt # Pentru fiecare linie din text, dacă este ultima linie, printeaza-o; ignoră restul liniilor sed -n '$p' foo.txt Se pot aplica mai multe acțiuni asupra unui fișier, folosind parametrul ''-e'' la fiecare acțiune: # Șterge liniile 4 și 2. sed -e '4d' -e '2d' file === awk === **awk** este un întreg limbaj de procesare a textului. În general, folosește un fișier de script pentru acțiuni, cu sintaxa: awk -f awk.script foo.file Există un bloc de BEGIN, unul de END și corpul scriptului. Exemplu de script: # Begin Processing BEGIN {print "Print Totals"} # Body Processing {total = $1 + $2 + $3} {print $1 " + " $2 " + " $3 " = "total} # End Processing END {print "End Totals"} Rezultate: Input Output 22 78 44 Print Totals 66 31 70 22 +78 +44 =144 52 30 44 66 +31 +70 =167 88 31 66 52 +30 +44 =126 88 +31 +66 =185 End Totals Fiecare câmp dintr-o linie poate fi folosită ca o variabilă: İnput 1 clothing 3141 1 computers 9161 1 textbooks 21312 2 clothing 3252 2 computers 12321 2 supplies 2242 2 textbooks 15462 awk 'if ($2 =="computers"){print}' sales.dat Output 1 computers 9161 2 computers 2321 == Exerciții == # Realizați un oneliner care parsează output-ul comenzii ''date'' și afișează un mesaj de forma ''Este ora X și Y minute''. # Realizați un oneliner care afișează username-ul utilizatorilor reali din sistem. Considerăm un utilizator real, un utilizator al cărui director ''home'' are forma ''/home/USER''. (hint: ''/etc/passwd'') # Realizați un oneliner care afișează numele fișierelor din ''/usr/include'' care includ antentul ''features.h''. #* **Hint**: ''grep'', ''cut''