2015-10-21 9:25 GMT+03:00 Mircea MITU <mir...@sigu.ro>: > > > > In cazul tau sed ar fi sed '/bash$/s/bash/kk/' /etc/passwd. Adicatelea > > "inlocuieste "bash" cu "kk" doar pe liniile care se termina cu "bash”. > > great, merge super ok > > sed "/home\/.*bash$/s/bin\/bash/bin\/kk/g” passwd.copy > > > > Desi > > daca faci s/bash$/kk/ global e acelasi lucru, da' ai mai invatat ceva > azi. > > > > nu chiar, ca elimina conditia existentei unui alt string >
Ntz, nu face decat daca se termina cu "bash", asta era conditia pe care o pusesesi. > > > Da' vorba lui mirceac, poate nu ar fi cazul sa dai cu toporul prin passwd > > si ar fi bine sa fii ceva mai precis. > > > > Gen: awk 'BEGIN {FS=":"; OFS=":" } $7=="/bin/bash" {$7="kk"} {print > $0}' > > /etc/passwd (urmand sa pui tu noul content in /etc/passwd dupa aia) > > > > Sau ca sa nu modifici tu cu scripturi idioate fisiere critice de sistem, > > awk -F: ' $7=="/bin/bash" {print $1} ' | while read user ; do chsh -s kk > > $user ; done > > > > 2 conditii in awk cum specific? Ca problema era sa inlocuiesc doar cand > home-ul este in /home/ (ca sa nu schimb si pt /root sau /perje) > > Scurt primer de awk pentru cei carora le e lene sa citeasca manualul: Un script awk e format din mai multe declaratii de forma : "conditie { action }" . Daca conditia nu se specifica, impicit este "always" adica pe fiecare record. Daca actiunea nu se specifica, default este { print $0 } adica recordul citit. Pentru fiecare record citit de la stdin (sau din fisierul dat ca argument), se evalueaza toate regulile si se actioneaza pe baza lor. Doua conditii speciale sunt BEGIN si END, care sunt luate in considerare doar la inceputul sau la sfarsitul listei de recorduri (comportament care a fost preluat similar si de perl). Variabila de redord separator e RS (se poate seta in BEGIN, default e "\n") cea de field separator e FS (se poate seta in BEGIN sau cu -F in linia de comanda, default e whitespace, cred ca ceva gen \s+ ). La citirea recordului se spliteaza in campuri dupa FS si se initializeaza variabilele $1, $2, ... pana la cate fielduri au fost cu valoarea lor, si NF care e number of fields (de notat ca variabilele din awk nu au sigil, $NF inseamna continutul ultimului field pentru ca NF e evaluat si $7 sau cat a fost se intampla sa fie ultimul). Pentru conditii se pot folosii fie functii booleene (merge if (foo) ) fie regexp-uri, fie combinatii. "/special line/ && if (NR >5 ) " inseamna ca face chestii doar pe liniile de la 5 incolo care contin "special line" in ele. Pentru ce vrei tu ar fi ceva gen awk -F: ' $6 ~ /^\/home/ && $7=="/bin/bash" {print $1} ' Cu asta s-a terminat lectia de awk de azi, come again. -- P. _______________________________________________ RLUG mailing list RLUG@lists.lug.ro http://lists.lug.ro/mailman/listinfo/rlug