User Tools

Site Tools


unixmix:capitole:capitol-06

Filtre de text

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'
    <?code>
    ** Ce observați?
    * Rulați comanda<code>
    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

  1. Realizați un oneliner care parsează output-ul comenzii date și afișează un mesaj de forma Este ora X și Y minute.
  2. 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)
  3. Realizați un oneliner care afișează numele fișierelor din /usr/include care includ antentul features.h.
    • Hint: grep, cut
unixmix/capitole/capitol-06.txt · Last modified: 2014/09/11 12:25 by razvan