Cursul 5 Comanda sed AWK Comanda sed sed
- Slides: 29
Cursul 5 Comanda sed AWK
Comanda sed • sed este prescurtat de la “stream editor”; nu este interactiv; primeşte operaţia (comanda) în linia de comandă şi fişierul(ele) asupra căruia se execută. sed are ca intrare un fisier(sau mai multe), executa anumite operatii asupra fisierului(lor) si rezultatul este depus intr-un buffer, al carui continut este transmis catre iesirea comenzii. • Sintaxa este de forma: sed optiuni script fisier(e) • Parametrii optiuni permit sa se controleze comportarea comenzii sed. • Parametrii script specifica o comanda ce se aplica fluxului de date. • Daca este necesar mai mult decit o comanda, trebuie sa se foloseasca optiunea -e pentru a o specica in linia de comanda sau the optiunea –f, pentru a o specifica intr-un fisier separat. • -n suprimă ieşirea; se afişează numai liniile specificate cu comanda p
• Fiecare comandă se aplică pe rând fiecărei linii selectate din fişierul dat ca intrare; dacă lipseşte partea de adresă, se selectează toate liniile. • Rezultatul se trimite implicit în fişierul standard de ieşire • Fanioane: g (global); aplică substituţia la toate aparitiile sablonului din fisier, altfel se aplică substituţia numai la prima linie intilnita. n înlocuieşte a n-a apariţie a tiparului p tipăreşte linia dacă s-a produs o înlocuire d ştergerea liniilor adresate. • Utilizarea fanionului d. • Exemplu: $cat /etc/passwd | sed ‘d’ are ca efect stergerea tuturor liniilor din copia fisierului /etc/passwd $sed -e ‘d’ /etc/passwd, are acelasi efect ca mai inainte $sed -e ‘d’ /etc/passwd > /tmp/newpasswd, iesirea comenzii este in fisierul /tmp/newpasswd
• Utlizarea comenzii p impreuna cu optiunea n • Exemplu: $cat /etc/passwd | sed ‘p’ | head -10 $cat /etc/passwd | sed -n ‘p’ | head -10 • Selectarea liniilor pe care se opereaza. sed recunoaste notiunea de adresa. Aceasta poate fi o anumita locatie dintr-un fisier sau un domeniu pe care se aplica sed. Cind sed nu intilneste adrese el executa operatiile indicate pe fiecare linie din fisier. • Exemplu: $cat /etc/passwd|sed ‘ 1 d’ | more adauga o adresa lui sed, inainte de fanionul d (nr. 1). Aceasta inseamna ca linia 1 din /etc/password va fi stearsa din bufferul lui sed si va afisa restul de linii. • $cat /etc/passwd|sed ‘ 1, 5 d’ liniile 1, . . , 5 ale fis. /etc/passwd vor fi sterse din bufferul lui sed si restul de linii din /etc/passwd vor fi afisate • Daca pt. specif. domeniului se transmit numere in ordine descresc. , se va aplic sed numai liniei cu primul nr. • Exemplu: $cat /etc/passwd|sed ‘ 10, 4 d’ va afisa continutul lui /etc/passwd , fara linia cu nr 10.
• Domeniul se poate defini specificind numai nr. cel mai mic de linie si un numar de linii care o urmeaza. • Exemplu: $cat /etc/passwd|sed ‘ 4, +5 d’ va afisa numai primele 3 linii şi liniile 10, 11, . . . • Complementarea domeniului de adrese se face cu caract. !, plasat dupa o specificare de domeniu. • Exemplu: $ cat /etc/passwd | sed ‘ 1, 5!d’ va afisa toate liniile din /etc/passwd, cu exceptia primelor 5. • Specificarea adresei cu o valoare initiala si o val. de avans se face cu semnul ~ precedat de un nr. de linie. • Exemplu: $ cat /etc/passwd | sed ‘ 1~3 d’ va afisa prima linie, a 4 -a linie, a 7–a linie etc. • Exemple: Alte moduri de adresare (expresii regulate) /^$/ toate liniile goale 1, /^$/ liniile de la începutul fişierului până la prima goală /cuvant/! liniile care nu conţin cuvant
• • Substituţia are sintaxa : s/sablon/inlocuire/[fanioane] Se cauta sablon si se inlocuieste cu inlocuire Pt. sablon se pot folosi expresii regulate. Exemple: $sed s/Unix/Linux/g fis. txt se inlocuiesc toate aparitiile textului Unix cu textul Linux in fisierul fis. txt $sed s/^$/”Linie goala”/ fisier. txt se inlocuieste prima linie goala intilnita cu textul Linie goala $cat /etc/passwd | sed ‘s/root/toor/’ inlocuieste in fisierul /etc/passwd cuvintul root cu toor, numai la prima aparitie. • Utilizarea fanioanelor I, i: realizeaza potrivirea fara a face distinctie intre literele mari si mici(case-insensitive). • Exemplu: $ cat /etc/passwd | sed ‘s/Root/toor/ig’ va face inlocuirile in tot fisierul /etc/passwd , si va inlocui toate aparitile de forma Root, ROOt etc.
• • Specificarea mai multor comenzi de editare pe aceeasi linie. Comenzile de editare sunt executate una dupa alta. Exemplu: $ cat fis. txt|sed ‘s/Ionel/Gigel/; s//Linie goala/’ Inlocuirea celei de-a n-a potriviri. Exemplu: $cat /etc/passwd|sed‘s/root/toor/3’|head -2, va inlocui numai a treia aparitie si va afisa numai primele doua linii din fisier. • Folosirea unui alt separator de siruri de caractere. Problema se pune cind trebuie sa se substituie un sir care contine caract. /. Se poate defini un alt separator, plasat imediat dupa s. • Exemplu: Presup. ca dorim sa schimbam directorul gazda al utiliz. cu drepturi de root, in fis. passwd. In mod curent el este /root, si dorim sa-l schimbam cu /toor. Pt. aceasta tastam: $cat /etc/passwd|sed ‘s: /root: /toor: ’|head -2 • In acest exemplu, am folosit ca sep. caract. : . Acelasi lucru se poate face cu caracterul de evitare . $cat /etc/passwd|sed ‘s//root//toor/’|head -2
• Utilizarea expresiilor regulate • In exemplele urm. folosim fisierul /etc/syslog. conf, al carui continut este: # /etc/syslog. conf Configuration file for #syslogd. # # For more information see syslog. conf(5) # manpage. # First some standard logfiles. Log by #facility. auth, authpriv. * /var/log/auth. log • Exemplu: $cat /etc/syslog. conf|sed ‘/^#/d’ /^#/ este o expresie regulata ce specifica ca se selecteaza toate liniile care incep cu #, care vor fi sterse. Se va afisa: auth, authpriv. * /var/log/auth. log • Daca se tasteaza: $ cat /etc/syslog. conf | sed -n ‘/^#/p’ Se vor afisa toate liniile care incep cu #.
• • Exemple: $cat /etc/syslog. conf|sed ‘/^$/d’ Are ca efect stergerea tuturor liniilor albe. In schimb: $cat /etc/syslog. conf|sed -n ‘/^$/p’ va afisa toate liniile albe. $ cat /etc/syslog. conf|sed -n ‘/^[abc]/p’, va afisa auth, authpriv. * /var/log/auth. log, deoarece expresia reg. ^[abc] adreseaza liniile care incep cu a, b sau c. Utilizarea adresarii prin numar de linie si expr. regulata. Exemplu: $cat /etc/syslog. conf|sed ‘ 1, /^$/d’ Va afisa: # # First some standard logfiles. Log by facility. # auth, authpriv. * /var/log/auth. log Comanda declanseaza stergerea de la prima linie , pina cind intilneste prima linie alba.
• Utilizarea de cuvinte cheie. • • • [[: alnum: ]] [[: alpha: ]] [[: blank: ]] [[: cntrl: ]] [[: digit: ]] [[: graph: ]] [[: lower: ]] [[: print: ]] [[: punct: ]] [[: space: ]] [[: upper: ]] [[: xdigit: ]] Caract. alfanumerice [a-z A-Z 0 -9] Caract. alfabetice [a-z A-Z] Caract. albe(spatii sau tab-uri) Caract. de control Numere [0 -9] Caract. vizibile (exclude spat. albe) Litere mici [a-z] Caract. tiparibile. Caract. de punctuatie Spatii albe Litere mari [A-Z] Cifre Hexazecimale [0 -9 a-f A-F]
• Referentierea expresiei regulate care se potriveste • Metacaracterul & reprezinta contintul sablonului care s-a potrivit. • Exemplu: Presupunem ca avem un fisier cu numere de telefon (Tf. Num), care contine: 5555551212 5555551213 5555551214 6665551215 6665551216 7775551217 • Dorim ca primele trei cifre sa fie puse intre paranteze rotunde. Se tasteaza: $sed –e ‘s/^[[: digit: ]][[: digit: ]]/(&)/g’ Tf. Num • Se va afisa: (555)5551212 (555)5551213 (555)5551214 (666)5551215 (666)5551216 (777)5551217 • Observam utilizarea fanionului g(global).
• Exemplu: Vrem ca pe fiecare linie urm. grup de 6 cifre sa fie impartit in 2 grupe de cite trei cifre, separate prin -. Tastam: $ sed -e ‘s/^[[: digit: ]]{3}/ (&)/ g’ -e ‘s/ [[: digit: ]]{3}/&-/g’ Tf. Num. txt >nums. txt $ cat nums. txt (555)555 -1212 (555)555 -1213 (555)555 -1214 (666)555 -1215 (666)555 -1216 (777)555 -1217 • Exemplu: Mutarea primului cuvînt din linie la sfîrşitul liniei. sed 's/[^ ]*)[ ]*(. *)/2 1 #/' fisier.
• Caută de la începutul liniei (^) o secvenţă de caractere care nu sunt spaţii ( [^ ]* ). • Aceste caractere vor deveni prima variabilă, lucru indicat de parantezele ( ). • Apoi trebuie să urmeze un număr de spaţii [ ]*. • Apoi urmează un număr oarecare de caractere. *. • Aceste ultime caractere devin variabila a doua ( ( ) ). • După ce o linie se potriveşte, ea este transform. : 2 1 # , adică a doua variabilă este pusă la început, urmată de un spaţiu, urmată de prima, urmată de semnul #. • Dacă aplicăm aceasta comanda următorului fişier text: Unu doi trei Patru cinci sase Sapte opt noua obţinem doi trei Unu# cinci sase Patru# opt noua Sapte#
• Citirea comenzilor de editare dintr-un fisier • Exemplu: Cu comanda cat se creeaza fisierul data 1, al carui continut este: Unu doi trei Patru cinci sase Sapte opt noua • De as. , se creaza script 1, care contine comenzile de editare: $cat >script 1 s/unu/patru/ s/patru/sapte/ s/sapte/unu/ • Apoi, se lanseaza: $sed -f script 1 data 1 Patru doi trei sapte cinci sase unu opt noua • Obs. utilizarea optiunii –f pt. a specifica utiliz. fis. de specificatii sed in interiorul comenzii.
AWK • Analog utilitarului GREP, AWK este un instrument pentru analiza si manevrarea usoara si eleganta a datelor. Versiunea originala a fost dezvoltata in 1977 de cãtre Alfred Aho, Peter Weinberger, and Brian Kernighan de la AT&T Bell Labs. O versiunea îmbunãtãþitã este operationala din 1985. Gawk este implementarea GNU a awk-ului (disponibila sub Linux). Aceasta se considera a fi compatibila versiunii 4 de Unix System V. In cele ce urmeazã utilitarul awk este tratat in general fãrã particularitãþi specifice unei versiuni. Din acest motiv se recomanda înainte de scrierea unui program awk consultarea bibliografiei aferente. Exemplele ilustrate au fost testate si executate atât sub Linux cat si sub Unix SVR 4. • Un program AWK este format din mai multe comenzi. O comanda este formata la rândul ei dintr-un sablon de selectie si un bloc de actiune: selectie { actiune } • Selectia se realizeazã prin folosirea expresiilor regulate. Actiunea are sintaxa apropiata de C si permite efectuarea unor operatii pe datele din fisier. Un fisier este vazut de un program awk ca fiind o succesiune de înregistrãri. Daca separatorul de înregistrare nu a fost modificat el având valoarea predefinita (caracterul 'n‘), înregistrarea este identica cu linia. Înregistrarea este împartita in câmpuri; separatorul de câmpuri este cont. in var. FS.
• 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. Contine 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. 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: BEGIN este adevarată înainte de prima linie din primul fişier END este adevarată după ultima linie din ultimul fişier
• Câmpuri si variabile • Fiecare înregistrare este impartita in câmpuri, functie de valoarea variabilei predefinite FS. Acestea sunt referite prin $1, $2, . . . ; $0 reprezinta toata înregistrarea curenta. • Exista urmatoarele variabile predefinite in programele AWK: • ARGC Numãrul argumentelor din linia de comanda. • ARGV sirul argumentelor din linia de comanda; sirul este indexat de la 0 la ARGC -1. • ENVIRON sirul variabilelor de mediu; sirul este indexat prin variabilele de mediu • Exemplu: ENVIRON["HOME"] poate fi /home/ilflorea. • FILENAME Numele fisierului de intrare curent. Daca nu este specificat nici un fisier in linia de comanda, valoarea variabilei FILENAME este ''. • FNR (File Number Records) Numãrul inregistrarii curente citita din fisierul de intrare. • FS (Field Separator) Separatorul de câmpuri la intrare, implicit 'b'. • NF (Number of Fields) Numãrul de câmpuri din înregistrarea curenta. • NR (Number of Records) Numãrul de înregistrãri inspectate. • OFMT Formatul de iesire pentru numere, implicit "%. 6 g".
• OFS (Output Field Separator) separatorul de câmpuri la iesire, implicit 'b'. • ORS (Output Record Separator) separatorul de înregistrare la iesire, implicit 'n'. • RS (Record Separator) separator de înregistrare, implicit 'n'. Daca RS este setat la sirul null, atunci inregistrarile sunt separate prin linii blanc. In acest caz, caracterul 'n' este separatorul de câmpuri, indiferent de valoarea lui FS. • RSTART Indexul primului caracter potrivit dintr-un apel al functiei match; 0 daca nu exista potrivire. • RLENGTH Lungimea sirului potrivit prin functia match; (1) in caz ca nu exista potrivire. • SUBSEP Caracterul folosit pentru a separa indici multipli la elemente de sir, implicit '