GREP

grep [ -[[AB] ]num ] [ -[CEFGVBchilnsvwx] ] [ -e ] sablon
       | -fnume-scenariu ] [ lista_fisiere  ]


Grep - cauta un anumit sir de caractere intr-un fisier sau in mai multe fisiere si afiseaza la iesirea standard rezultatul.

Optiuni:

-c (count) - afiseaza numai numarul de linii care se potrivesc cu sablonul
-h (hide)  - nu afiseaza numele fisierului
-i (ignore case) - nu face diferenta intre litere mari si litere mici la
           cautare
-l  - afiseaza numai numele de fisiere care contin sirul cautat (nu si
    liniile din aceste fisiere)
-n  - afiseaza liniile care se potrivesc sablonului precedate de numarul de
    ordine relativ la inceputul fiecarui fisier
-s  - nu afiseaza nimic, se foloseste atunci cand ne intereseaza daca s-a
    gasit sau nu cel putin o potrivire, intoarce 0 - daca a gasit
                             1 - daca nu a gasit
                             2 - eroare
-v - afiseaza liniile care nu contin sirul dat
-w - afiseaza liniile in care sirul cautat este un cuvant intreg
-e - se foloseste daca vrem ca sablonul sa inceapa cu "-"


Sablonul este o expresie regulara.

Expresie regulara:

Expresia regulara este o secventa de caractere in care unele caractere au seminficatie speciala. Cu caracterul "\" se evita semnificatia speciala a unui caracter, "..." evita orice caracter mai putin $ si '...'  iar cu '...' se evita orice caracter.

Caractere cu semnificatie speciala:

1) "." - orice caracter
2) [sir_caractere] - orice caracter din sirul de caractere
   [c1 - c2] - orice caracter cuprins intre caracterele c1 si c2 in ordine
        lexicografica
   [^ sir_caractere] - negatia lui [sir_caractere]
3) "^" - daca e primul caracter din sablon semnifica inceput de linie
     ex : $grep ^if fis1 fis2
    afiseaza liniile din fis1 si fis2 care incep cu if
       $grep if fis1 fis2
    afiseaza toate liniile din fis1 si fis2 care contin secventa "if"
4) "$" - daca e ultimul caracter din sablon semnifica sfarsit de linie
     ex : $grep fi$ fis1 fis2
        afiseaza liniile din fis1 si fis2 care se termina cu fi
5) \< - semnifica inceput de cuvant (un cuvat este format din litere, cifre
    sau -, orice alt caracter este considerat separator)
6) \> - semnifica sfarsit de cuvant
7) * - repeta caracterul anterior interpretat ca expresie regulara de
    oricate ori    
8) \{n\} - unde n este un numar intre 0 si 255
    repeta expresia anterioara de exact n ori
9) \{n,\} - repeta expresia regulara anterioara de cel putin n ori
10)\{n,m\} - repeta expresia regulara anterioara de cel putin n ori si de
    cel mult m ori
11)\( expr-regulara\) <=> expr-regulara
12)\n - unde n este intre 0 si 512
    \n inlocuieste un sir cu care s-a inlocuit cea de-a n-a expresie
    regulara aflata intre paranteze
      ex: grep '^\(.*\) \(.*\) \1$' fis1
          afiseaza toate liniile care incep si se termina cu acelasi cuvat
      separtor fiind  spatiu si contin mai mult de doua cuvinte

Exemple:

ls -l | grep .r..r..r..

afiseaza toate fisierele si directoarele din directorul curent pentru care exista drepturi de citire (r = read) pentru toate cele trei categorii de utilizatori.

grep \<ana\> date.txt

afiseaza liniile de forma
ana are mere
dar nu afiseaza liniile de forma:
maria are o banana

 

SED


  sed [-n] [-g] [-e scenariu ] [-f fisier_scenariu ] [ lista_fisiere ] ...

Sed prelucreaza fisiere interpretate text conform unui scenariu sed. Prelucreaza linie cu linie folosind un buffer temporar si afiseaza bufferul temporar la iesirea standard (daca nu se foloseste optiunea -n).

Un scenariu sed este format din linii de forma
    
    conditie instructiune
 
Conditii:
1) conditie vida - adevarata pentru toate liniile din fisier
2) un numar n - adevarata pentru linia cu numarul de ordine egal cu n
(liniile se numeroteaza cumulat in lista de fisiere)
3) $ - conditie adevarata pentru ultima linie din fisier
4) /expresie regulara/ - conditie adevarata pentru linile care contin cel
        putin un subsir care se potriveste cu expresia regulara
5) expr1,expr2 - adevarata pentru liniile aflate intre linia care se
        potriveste cu expr1 si linia care se potriveste cu expr2
    ex:
    $sed 1,10 instructiune fis1
        executa instructiune asupra liniilor de la 1 la 10
    $sed 10,$ instructiune fis1 fis2
        executa instructiune asupra liniilor de la 10 la sfarsitul
        fisierului obtinut prin concatenarea lui fis1 cu fis2

Instructiuni:

1) p - afiseaza bufferul temporar la iesirea standard
    ex:
    $sed p fis1
        afiseaza fiecare linie de doua ori
    $sed -n p fis1
        afiseaza fiecare linie o data
2) d - sterge zona temporara
3) i\ - are ca parametru un text (dat pe liniile urmatoare in
           fisierul scenariu) pe care il afiseaza la iesirea standard
    ex:
    fis-s:
        i\
        ttttt\
        11111
    $sed -f fis-s fis1
4) a\ - analog cu \i dar afiseaza dupa prelucrarea fiecarie linii
5) y/sir1/sir2/ - unde sir1 si sir2 au lungimi egale
        realizeaza o translatare inlocuind caracterele din fisierele
        de intrare care se gasesc in sir1 cu caracterele
        corespunzatoare din sir2
6) s/expresie_regulara/sir/[flaguri] - inocuieste prima aparitie a unui sir
        care se potriveste cu expresia regulara cu sirul "sir"
    flaguri: - daca lipseste se inlocuieste numai prima aparitie
         - daca este un numar n intre 1 si 512 se inlocuieste exact
            a n-a aparietie
         - daca este "g" inlocuieste toate aparitiile din linii
         - daca este "p" afiseaza buferul tampon la iesire daca s-a
            produs vreo modificare in linia respectiva

Exemple:
1. Se cere sa se elimine toate secventele dintr-un
fisier.

$sed 's/[0-9][a-z,A-Z][0-9]//g' fis1

2. Sa se inlocuiasca ultimul cuvant din fiecare linie cu primul cuvant.
Cuvintele contin doar litere si cifre si sunt separate prin spatiu.

$sed "s/\(^[a-z,0-9]*\)\(.*\)\( [a-z,0-9]*$\)/\1\2 \1/g" fis1

obs. parametrii din linia de comanda se refera cu $1, $2, .. $n si se poate
folosi comanda shift.

 

AWK

Acest utilitar prelucrează fişiere text, selectând acele linii din text care satisfac condiţii impuse de o listă de şabloane (expresii regulare) indicate la apelul utilitarului. Numele lui vine de la cei trei proiectanţi şi implementatori ai lui: A. Aho, P. Wieinberger şi B. Kerninghan.

Sintaxa:

awk [ -f fisier-scenariu ] [ -Fc ] [ scenariu ] [ variabila=valoare ... ][ nume fisiere...]

Intrarea în awk este constituită fie din fişierul de intrare standard, fie din fişierele ale căror nume sunt date în linia de comandă. Rezultatul filtrării prin awk este afişat la ieşirea standard.

Scenariu descrie acţiunile de filtrare. Este descris prin linii de forma:

conditie { instructiuni}

awk tratează pe rând câte o linie din fişierele de intrare şi pentru fiecare execută instructiuni atunci când conditie ia valoarea true. de Dacă conditie lipseşte atunci se execută instructiuni pentru toate liniile din fişiere.

conditie - este o expresie logică construită cu operatorii din C: ||, &&, !, (). Operanzii pot fi expresii aritmetice, expresii relationale, constante şi variabile. Variabilele nu trebuie (să fie) declarate, ele se iniţializează automat, tipul lor deducându-se din context. Pentru variabilele de tip şir de caractere există operatorul de concatenare (spatiu) precum şi câteva funcţii de lucru cu şiruri. Se pot folosi variabile de tip tablou ale căror indici pot să fie numerici sau şiruri de caractere.

 

Condiţii predefinite:

 

Variabile predefinite:

 

Accesarea câmpurilor:

 

Funcţii predefinite:

 

Instrucţiuni

 

Exemple:

1. Să se afişeze dintr-un fişier primul cuvânt din fiecare linie

        a) fără fişier scenariu

                awk '{ print $1}' nume_fis

        b) cu fişier scenariu

                fis-s : {print $1}

                awk -f fis-s nume_fis

2. Să se afişeze dintr-un fişier linile mai lungi de 5 caractere, iar afişarea lor să se facă în ordinea inversă apariţiei lor.

        a) fără fişier scenariu

              awk 'length>5 {x[i++]=$0} \

              END { for(j=i; j>0 ; j--) print x[j]}' nume_fis

        b) cu fişier scenariu

              fis-s : length>5 {x[i++]=$0}

                      END { for(j=i; j>0 ; j--) print x[j]}

              awk -f fis-s nume_fis

 

Probleme propuse:

grep (se vor rezolva două probleme)

 

  1. Să se afişeze conţinutul tuturor fişierelor text din directorul dat ca parametru în linia de comandă şi din subdirectoarele lui.
  1. Să se afişeze numele fişierelor din linia de comandă care conţin un anumit cuvânt dat şi el ca parametru în linia de comandă. Se cere să se afişeze şi numărul lor.
  1. Să se afişeze numele tuturor fişierelor binare din directoarele date ca parametri în linia de comandă şi din subdirectoarele acestora.
  1. Să se afişeze numele tuturor utilizatorilor din sistem care fac parte dintr-un anumit grup al cărui identificator este dat ca parametru în linia de comanda. Să se afişeze şi numele grupului.
  1. Să se afişeze numele tuturor utilizatorilor care execută o anumită comanda dată ca parametru.
  1. Să se afişeze numele tuturor utilizatorilor care s-au conectat la serverul curent într-o anumita dată şi de la o anumită maşina date ca parametri în linia de comandă.
  1. Pentru o listă de servere date ca parametri în linia de comandă se cere să se afişeze dacă sunt accesibile sau nu. Pentru a se testa dacă un server este accesibil sau nu se poate folosi comanda ping.
  1. Pentru anumiţi utilizatori daţi în linia de comandă se cere să se afişeze dacă au lucrat la o anumită dată sau nu.
  1. Pentru o anumită listă de utilizatori, dată în linia de comandă, se cere sa se afiseze dacă lucrează sau nu.
  1. Să se afiseze pentru fiecare utilizator din linia de comandă, un mesaj indicând dacă este permisa sau nu listarea conţinutului directorului gazdă.
  1. Să se afişeze numele tuturor utilizatorilor daţi ca parametri în linia de comandă care nu s-au conectat niciodată la serverul curent.
  1. Pentru o listă de directoare date ca parametri (şi din subdirectoarele acestora) să se steargă toate fişierele al căror nume sunt date în fişierul date ca prim parametru.

sed (se vor rezolva trei probleme)

  1. Se cere să se şteargă toate apariţiile cuvintelor date ca parametri din fişierul care este dat ca prim parametru.
  1. Să se şteargă toate liniile din fişierele date ca parametri care conţin un anumit text indicat într-un prim parametru.
  1. Să se şteargă din primele 30 de linii din fişierele date ca parametri acelea care conţin textul indicat de primul parametru.
  1. Să se adauge în faţa fiecarei litere mici cuvântul indicat ca prim parametru. Fişierele tratate sunt ceilalţi parametri din linia de comanda.
  1. Să se şteargă toate cuvintele care conţin cel puţin o cifră din fişerele date ca parametri.
  1. Să se înlocuiască toate caracterele care nu sunt litere mari cu un caracter indicat de primul parametru. Fişierele tratate sunt indicate de ceilalţi parametri.
  1. Să se înlocuiască toate vocalele litere mici din fişierele date ca parametri cu litere mari corespunzatoare şi viceversa.
  1. Să se înlocuiască al treilea cuvânt din fiecare linie cu primul cuvânt. Cuvintele sunt separate de “:” şi conţin doar litere sau cifre.
  1. Să se ştearga cuvintele de pe poziţiile 2 şi 4 din fişierele indicate ca parametri. Cuvintele conţin doar litere sau cifre şi sunt desparţite prin spaţiu.
  1. Să se schimbe între ele cuvintele de pe poziţiile 1 şi 3 din fişierele date ca parametri. Cuvintele conţin doar litere şi sunt separate prin orice alt caracter.
  1. Să se convertească un fişier html într-un fişier text folosind comanda sed (să se elimine tot conţinutul fişierului html aflat între caracterele “<” şi “>”).
  1.  Să se înlocuiască într-un fişier text toate apariţiile unor numere formate dintr-o singură cifră astfel: numarul format din cifra 1 se va înlocui cu cuvantul “un”, numarul 2 cu cuvântul “doi”, etc. Numărul 11 va fi lăsat aşa cum este.

awk (se vor rezolva cel putin 2 probleme)

  1. Sa se calculeze si afiseze login-ul si suma cifrelor din login pentru fiecare utilizator din sistem care are login-ul compus dintr-o combinatie alfanumerica.
  1. Sa se afiseze continutul oricitor fisiere, fiecare fisier  fiind afisat incepind cu ultima linie, continuind cu cea anterioara acesteia s.a.m.d.
  1. Sa se afiseze continutul oricitor fisiere dupa cum urmeaza:primul fisier afisat asa cum este iar fisierul urmator cu cuvintele din linii cuvintele fiind separate de :) scrise in ordine inversa. (Modul de afisare se reia pentru fisierele urmatoare).
  1. Sa se afiseze liniile din fisiere care contin un acelasi cuvint aflat in pozitii consecutive. Pentru liniile respective sa se afiseze si numarul  liniei precum si cuvantul implicat.(in cadrul fisierului din care face parte).
  1. Sa se afiseze din fiecare fisier numerele liniilor care au lungimea cel putin 10. De asemenea sa se afiseze continutul liniilor respective mai putin primele 10 caractere. La terminarea analizei unui anumit fisier se va afisa numele fisierului si numarul de linii care au fost afisate.
  1. Sa se afiseze pentru fiecare fisier: numele acestuia, si numarul mediu de cuvinte per linie  per fisier (media numarului de cuvinte pentru liniile fisierului). Se va afisa si media numarului de cuvinte pentru toate fisierele luate la un loc.
  1. Sa se afiseze pentru oricite fisiere, pentru liniile din acestea care sint mai lungi de 30 de caractere, numarul liniei (din cadrul fisierului), primul cuvint si ultimul.
  1. Sa se faca suma tuturor cimpurilor, care reprexinta numere valide, din liniile unui fisier . La terminarea analizei lui sa se afiseze suma obtinuta si raportul dintre numarul de linii care contin numere valide si cele care nu contin deloc numere valide.  Aceasta sa se faca pentru oricite fisiere. (Ex: Suma =XXXXXX ContineNr/NuContineNR = 100 / 25)
  1. Sa se afiseze numele tuturor fisierelor din linia de comanda care contin propozitii in care se repeta un cuvant mai mult sau egal de doua ori. Se va afisa deasemenea pentru fiecare asemenea caz numarul liniei si cuvantul implicat.(prima sa aparitie in propozitia respectiva)
  1. Sa se afiseze numarul de fisiere din linia de comanda a lui awk, numarul total de cuvinte si numarul mediu de cuvinte din fisiere.
  1. Sa se afiseze dintr-o lista de fisiere numele acelui fisier care are numar maxim de cuvinte si numarul cuvintelor.
  1. Sa se inlocuiasca intr-un numar oarecare de fisiere orice aparitie a unui anumit cuvint cu un alt cuvint; cuvintele respective vor fi date in linia de comanda awk ca si parametri).
  1. Sa se afiseze pentru o masina Unix login-ul si numarul utilizatorilor care au fost logati in sistem intr-un interval orar al unei date (acesti parametri vor fi specificati in linia de comanda). (hh:mm-hh:mm 10-oct-2002). Data se poate specifica in orice format. Se va folosi eventual comanda last.
  1. Sa se afiseze pentru o masina Linux numarul mediu de utilizatori pentru un interval orar (hh:mm-hh:mm) in decursul unei luni calendaristice. Se va folosi comanda last.
  1.  Sa se afiseze pentru fiecare fisier din linia de comanda raportul dintre numarul de vocale si numarul de consoane.
    Ex (file1.txt v/c = 123/12).

     16. Sa se afiseze numele fiecarui fisier din linia de comanda care contine propozitii cu mai mult de 30 cuvinte intr-un procent mai mare de 25% (din nr total de propozotii al fisierului). O propozitie este delimitata de caracterele (. ! ? ).

 

problema C

Sa se scrie un program C care aloca o matrice 3-dimensionala ale carei dimensiuni sunt citite de la tastatura. Matricea se va popula cu valoarea 1 peste tot si apoi se va calcula suma tuturor elementelor. La sfarsit, memoria alocata se va dealoca.

Problema va fi rulata cu valgrind (alocare si dealocare corecta a memoriei , gasirea problemelor de memorie cu valgrind):
> gcc -Wall -pedantic  p.c -o p.o
> valgrind ./p.o