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

Raspunde prin e-mail lui