Sunteți pe pagina 1din 9

LABORATOR 5

Expresii regulate, cautari si sortari

Expresii regulate
O expresie regulata (regex) reprezinta o modalitate (metoda) de identificare a unui
string (sir de caractere) dintr-un text dat conform anumitor reguli. Un regex este
reprezentat fizic printr-un string format din caractere speciale.

Reguli:
1. Blocul fundamental reprezinta un singur caracter si se selecteaza pe sine.
2. O expresie paranteza patrata (bracket expression) reprezinta o lista de caractere
cuprinsa intre "[" si "]" si descrie un singur caracter din acea lista. De exemplu, expresia
regulata b[aeiou]g selecteaza cuvintele bag, beg, big, bog, bug
3. Daca primul caracter este "^" (caret), acesta descrie orice caracter care nu se
gaseste in lista.
4. "[x-x]" - In interiorul unei expresii, paranteza patrata, un "range expression"
reprezinta 2 caractere separate prin -(minus) si selecteaza(identifica) orice caracter care
se gaseste intre cele 2 caractere din range expression. Expresia regulata a[2-4]z
selecteaza cuvintele a2z, a3z, a4z
5. "^" (caret) - In afara parantezelor drepte reprezinta un metacaracter care
identifica inceputul unei linii (daca este primul caracter din regex).
6. "$" reprezinta un metacaracter care identifica sfarsitul unei linii (daca este
ultimul caracter din regex).
7. Backslash ("\"), urmat de un caracter special, selecteaza caracterul special
respectiv. Caractere speciale sunt: ., *, [, \ (punct, asterix, paranteza dreapta deschisa si
backslash).
8. "?" (semnul intrebarii) selecteaza 0 sau 1 caractere anterioare.
9. "*" (asterix) selecteaza zero (0) sau mai multe caractere anterioare.
10. "+" (plus) selecteaza caracterul anterior o data sau de mai multe ori.
11. "{n}" Elementul precedent este selectat de n ori (exact).
12. "{n,}" Elementul precedent este selectat de n sau mai multe ori.

13. "{n,m}" Elementul precedent este selectat de cel putin n ori dar nu mai mult de
m ori.
14. caracterul . reprezinta orice caracter exceptand newline
15. \(REGEXP\) - grupeaz REGEXP pentru a fi folosita ca o subexpresie regulata
in sensul de mai sus. De exemplu, '(abcd)'* nseamn potrivire cu 0 sau mai multe
apariii ale secvenei 'abcd' in timp ce 'abcd*' nseamn potrivire cu 'abc' urmat de 0 sau
mai multe apariii ale caracterului 'd'. De asemenea, aceasta organizare a expresiilor
regulate permite referirea lor ulterioara prin constructii precum \1, \2 pana la \9. Astfel,
\1 desemneaz prima subexpresie regulata din cadrul unei expresii regulate, \2
desemneaz a doua subexpresie regulata, s.a.m.d.
Exemplu:
"\([a-z]\)\1" expresie regulata ce cauta 2 litere identice aa, bb, cc
"\([a-z]\)\1\{2\}" -expresie regulata ce cauta 3 litere identice bbb, ccc, ddd
16. Caracterul \b

reprezinta un delimitator folosit pentru match-uri "whole

words" . exemplu Expresia regulata \b[a-z]{5}\b selecteaza toate cuvintele de exact 5


litere de pe fiecare linie dintr-un fisier

NOTA-Expresii regulate basic vs Expresii regulare extinse


In cazul expresiilor regulate basic, metacaracterele ?,+,{,},|,(,) isi pierd intelesul special->
vor

trebui

precedate

de

caracterul

escape

sau

putem

folosi

comanda

egrep(echivalenta grep E).

Exemple
1.

Regex-ul [0123456789] - reprezinta o singura cifra iar [^0123456789]

reprezinta orice caracter care nu este cifra.


2.

Ancorare:

^ab

- linie care incepe cu ab

ab$

- linie care se termina cu ab

^$

- linie goala

^a[a-z0-9]
3.

- linie care incepe cu "a" urmat de orice caracter intre "a" si "z" sau "0" si "9"
Patternul a\?b se potriveste cu 'b' si 'ab'. Patternul a\+b\+ se potriveste cu

una sau mai multe apariii ale lui 'a' urmate de una sau mai multe apariii ale lui 'b'.
Patternurile '.*' si '.\+' se potrivesc cu toate sirurile de caractere; deosebirea dintre ele
este ca primul se potriveste si cu sirul vid in timp ce al doilea se potriveste cu toate
sirurile nevide.
4.

Gasirea tuturor liniilor care contin un string de tip CNP dintr-un fisier (se

presupune ca un CNP incepe cu 1,2 sau 7 pentru cetatenii straini rezidenti).


[127][0-9]\{12\}

5.

Daca se doreste gasirea tuturor liniilor care contin DOAR string de tip CNP

se foloseste "^" pentru ancorarea regex-ului la inceput de rand si "$" pentru ancorarea
regexului la sfarsit de rand.
^[127][0-9]\{12\}$
6.

Crearea unui fisier care sa contina toate fisierele si doar fisiere (de tip regular

file) din /etc eliminand liniile goale, liniile care contin cuvantul 'total' sau liniile care
afiseaza directoare.
ls -lR /etc/ | egrep -v '(^$|^total|^d)' > etc_content

Globbing characters
Globbingul este operatia de expandare a unui sablon wildcard in lista de cai ce
corespund sablonului. Un string este un sablon wildcard daca acesta contine unul din
caracterele: ?, *, [,].

* -reprezinta orice caracter, de oricate ori indiferent de pozitia in care apare: *ex*,
ex*, *ex; Exemplu:

cat ex* -afiseaza continutul tuturor fisierelor al caror nume incep cu ex

cat *ex afiseaza continutul tuturor fisierelor al caror nume se termina in


ex

cat *ex* -afiseaza continutul tuturor fisierelor al caror nume contine stringul
ex

? reprezinta exact un caracter necunoscut: ?ex poate reprezenta 1ex, 2ex, eex,
aex, etc

\ -escape character

[...] reprezinta unul dintre caracterele aflate intre paranteze

[a-z] reprezinta un range de caractere

Cautari
Grep si egrep
grep [options] PATTERN [FILE...] - cauta sabloane de text (string patterns) in fisiere
sau in outputul unei comenzi.
egrep [options] PATTERN [FILE...]- cauta sabloane de text folosind expresii regulate
extinse in fisiere sau in outputul unei comenzi
-i

= ignore case

-n

= numarul liniei din fisierul in care a fost gasit patternul

-R

= recursiv

-v

= invert match

-w

= cauta numai cuvinte

-H

= afiseaza numele fisierului in care a fost gasit pattern-ul

=interpreteaza sablonul ca pe o expresie regulara extinsa

-E

Exemple
1.

Cautarea cuvantului 'nameserver' in toate fisierele din /etc/

$grep 'nameserver' /etc/*


2.

Cautarea cuvantului 'root' in /etc/passwd cu afisarea numarului liniei pe

care se gaseste.
$ grep -n 'root' /etc/passwd
3.

Cautarea tuturor proceselor numite httpd care ruleaza

$ ps -ef | grep httpd


4.

Cautarea cuvantului text in fisierul myfile.txt. Vor fi afisate doar liniile care

contin exact cuvantul text nu si liniile in care acesta este parte a unui alt cuvant.
$ grep -w "curs" myfile.txt
5.

Cautarea apartiei cuvantului abcd de 2 ori intr-un fisier

$ egrep '(abcd) '{2} fisier


6.

Cautarea liniilor pe care se regaseste un string de tip CNP

$ grep '[127][0-9]\{12\}' fisier


7.

Cautarea liniilor care contin un grup de 2 litere care se repeta


grep "\([a-z]\{2\}\)\1" fisier

- va gasi cuvinte de forma mama tata

banana
8.

Gasirea cuvintelor palindrom de 5 litere dintr-un fisier (ex. radar)


grep w '\([a-z]\)\([a-z]\)[a-z]\2\1' fisier

Alte exemple:
$egrep a?b fisier
$ egrep -c '^begin|end$' myfile.txt
$grep 'acesta\|curs' myfile.txt

sau $ egrep 'acesta|curs' myfile.txt

$ grep -c 'root' /etc/passwd


$ grep .m hello
$ grep '^$' filename
$ ls | grep ile

----cautare linii goale

---listarea fisierelor al caror titlu contine stringul ile

Exercitii:
1. Gasiti toate fisierele din folderul /etc care contin stringul eth0 sau eth1
2. Gasiti toate fisierele din directorul dir1

care contin stringul This urmat pe

aceeasi linie de stringul file


3. Listati toate fisierelor din directorul curent al caror nume incepe cu f si are exact
4 litere

Find

Comanda find cauta fisiere si directoare dupa criterii complexe in mod recursiv. De
obicei criteriile sunt: type, mtime, ctime, size si name.
find [path...] [expression]
Daca unul dintre argumente este numeric si are valoarea n se poate folosi:
+n
-n
n

for greater than n


for less than n
for exactly n

-type f

= tipul este fisier

-type d

= tipul este director

-user uname

= userul este uname

-group gname

= grupul owner este gname

-links n

= fisierul are n hard link-uri

-perm mode

= permisiunile fisierului sunt exact mode (octal or symbolic)

-perm -mode

= all of the permission bits mode are set for the file

-perm +mode

= any of the permission bits mode are set for the file

-size n

= marimea fisierului este n (poate fi folosit ca sufix c=bytes, b=blocuri


de 512 bytes, k=kilobytes, M=megabytes, G=gigabytes)

-inum i_number = fisierul are nr. inod inode_number


-name REGEX

= cauta dupa nume folosind regular expression

-not

= neaga urmatoare optiune

Exemple
1. Cauta recursiv fisiere cu dimensiunea mai mare de 2M care-l au owner pe root
$ find / -size +2M -user root -type f
2. Cauta fisiere din /etc care nu-l au owner pe root
$ find /etc -not -user root
3. Alte exemple
$ find /etc/ -name resol
$ find /etc/ -name resol*
$ find /etc/ -size +1M
$ find / -size +1M
$ find /var/ -size +1M user root
$ find /var/ -size +1M not user root
$ find /sbin/ -links +1
$ find /etc/ -type f
$ find /var/ -size +1M not user root
$ find . -atime -5

Exercitiu: Gasiti toate fisierele din directorul curent al caror nume incepe cu o litera
urmat de caracterul . si o extensie.
R: $ find . -name "[a-z]*.*"
Criteriile comenzii find sunt asociate folosind SI logic (optiunea -a care este
default) si SAU logic ( -o).
Comanda find permite executia unei comenzi pentru fiecare din rezultatele
intoarse.

Exemplu
Afisarea continutului fisierelor din directorul curent ale caror nume incepe cu fi.
find . -name "fi*" -exec cat '{}' \;

Locate
locate [options] PATTERN [FILE...] - cauta fisiere intr-o baza de date dupa nume sau
anumite pattern-uri.
Actualizarea bazei de date (/var/cache/locate/locatedb) cu denumirile si locatiile de
fisiere se face cu ajutorul comenzii updatedb.
$ updatedb
$ locate "*.png"
Rulati succesiv comenzile. Ce obsevati?
$ locate -b 'rez'
$ locate -b '\rez'

Sed
sed [options] script [input-file] filtreaza si modifica text
sed are mai multe comenzi dar cea mai folosita dintre acestea este substitutia:s Aceasta
comanda inlocuieste toate aparitiile unui string selectat de o expresie regulata cu o noua
valoare. s/regexp/replacement
Exemplu:
1.
10
20
30
40
50

Creati fisierul 1.txt cu urmatorul continut


socks
shirts
pants
hats
gloves

Rulati comanda:
$ sed 's/pants/dresses/' 1.txt
Ce observati

$echo daytime | sed s/day/night/


Ce observati?
2. Creati fisierul 2.txt cu urmatorul continut
one two three, one two three
four three two one
one hundred
Rulati comanda:
$sed 's/one/ONE/' 2.txt
Ce observati?
Solutie: $ sed 's/one/ONE/g' 2.txt
Se observa ca in prima faza se produce nlocuirea primei apariii a lui pattern1. Pentru a
se realiza nlocuirea tuturor apariiilor se folosit opiunea /g (global).
Ce face urmatoarea comanda?
$ sed 's/one/ONE/2' 2.txt
$ sed 's/0/chicken/' 1.txt |sed 's/cken/mp/'
3. Creati fisierul fruits cu urmatorul continut
fruit price
banana

0.89

banana

0.89

peach0.79
peach0.79
kiwi 1.50
pineapple

1.29

apple 0.99
apple 0.99
mango

2.20

Ce fac urmatoarele comenzi?


$ sed -n '/0\.[0-9][0-9]$/p' fruits
$ sed '/1\.[0-9][0-9]$/d' fruits
Se observa necesitatea folosirii opiunii -n. In mod obisnuit, sed afiseaz toate liniile
de la intrare la iesire. Daca dorim sa eliminam intrarea despre un fruct vom folosi
comanda (in cazul folosirii aciunii d nu mai este nevoie sa precizam opiunea -n):
Caracterul special & este folosit pentru a adresa patternul cu care s-a fcut
potrivirea. Exemple :
$ sed 's/[a-z]\+/(&)/' fruits

$ sed r 's/[a-z]+/(&)/' fruits

$ echo "123 abc" | sed 's/[0-9]*/(&+&)/'

Spatii de adrese

Sed-ul ofer posibilitatea de a restrnge spaiul liniilor de intrare astfel:

restricia la o singura linie specificata prin numrul acesteia


$ sed '2 s/0\.[0-9][0-9]$/(&)/' fruits
$sed -n '2p' fruits

restricia la un interval de linii date de numerele acestora


$ sed '2,$ s/0\.[0-9][0-9]$/(&)/' fruits
$ sed -n '2,4p' fruits

restricia la o mulime de linii echidistante prin construcia


$sed -n '1~2p' fruits ->afiseaza liniile impare din fisierul fruits

restricia la toate liniile care conin un pattern :


$ sed '/^b/ s/[0-9]//' fruits

Exercitii:
1. Afisati liniile care incep cu o vocala sau cu litera p
2. Stergeti liniile care incep cu litera b

Sortari
Comanda sort
sort [OPTION]... [FILE]...
-b

--ignore-leading-blanks

ignore leading blanks

-d

--dictionary-order

consider only blanks and alphanumeric characters

-f

--ignore-case

fold lower case to upper case characters

-n

--numeric-sort

compare according to string numerical value

-r

--reverse

reverse the result of comparisons

-c

--check

check whether input is sorted; do not sort

-k

--key=POS1[,POS2]

start a key at POS1, end it at POS2 (origin 1)

-m

--merge

merge already sorted files; do not sort

-o

--output=FILE

write result to FILE instead of standard output

-t

--field-separator=SEP

use SEP instead of non-blank to blank transition

-u

--unique

with

-c, check for strict ordering; without -c,

output only the first of an equal run


-z

--zero-terminated

end lines with 0 byte, not newline

Comanda sort este utilizata pentru sortarea liniilor alfabetic.


O opiune utila in cazul sort este sortarea dup valoarea numerica a irurilor.
Pentru aceasta folosim -n.
De multe ori ieirea apare intr-o forma in care elementele de sortat sunt intr-o
alta coloana (nu prima, cea folosita implicit de sort). Pentru aceasta se poate folosi
opiunea -k (key). Sintaxa, in cazul folosirii acestei opiuni, este:
sort -k start, end file
Start este coloana de start a cheii, iar end este coloana de stop a cheii. Prima
coloana este cea dup care se face sortarea, iar, in cazul in care sunt doua sau mai
multe elemente egale, se face deosebirea intre acestea folosind coloana urmtoare din
cheie, etc.

Exemple
1. Sortarea in ordine alfabetica (si apoi inversa) a liniilor din fisierul fis1
$ sort fis1
$ sort r fis1
2. Sortarea in ordine alfabetica dupa coloana a 2-a din fisier
$ sort k2 fis1
3. Sortarea in ordine alfabetica a liniilor sortate in functie de valoarea numerica de pe
coloana 3 din fisierul fis1 si eliminarea liniilor identice
$ sort unk3 fis1