= 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''