2 votes

awk : comment utiliser une variable comme motif

J'ai un fichier dans un format :

==============================
nfsserver1.example.com
==============================
/vol/vol1   -sec=sys,rw=clinet1,root=clinet10
/vol/vol2   -sec=sys,rw=clinet1,root=clinet10

==============================
nfsserver3.example.com
==============================

==============================
nfsserver4.example.com
==============================
/vol/vol1   -sec=sys,rw=clinet4,root=clinet10

et j'ai besoin de le reformater en ceci :

nfsserver1.example.com /vol/vol1    -sec=sys,rw=clinet1,root=clinet10
nfsserver1.example.com /vol/vol2    -sec=sys,rw=clinet1,root=clinet10
nfsserver3.example.com
nfsserver4.example.com /vol/vol1    -sec=sys,rw=clinet4,root=clinet10

C'est ce que j'ai essayé :

while read server; do
    echo "---- ${server} -----------------------------------------"
    cat file.txt|\
        grep -v "========"|\
        awk -v srv=${server} '/^nfsserver1\.example\.com$/ {f=1} f; /^$/ {f=0}'|\
        grep -v "^$"|\
        awk -v srv=${server} '{printf("%s %s\n",srv,$0)}'
    echo
    server=""
done < <(cat file.txt|grep "^[a-z].*\.example\.com$")

mais je ne sais pas exactement comment je peux intégrer une variable dans une recherche de motifs. J'ai essayé ceci :

awk -v srv=${server} '$0 ~ srv {f=1} f; /^$/ {f=0}'

Mais cela produit une sortie incorrecte et je voudrais avoir une correspondance exacte avec la variable.

---- nfsserver1.example.com -----------------------------------------
nfsserver1.example.com nfsserver1.example.com
nfsserver1.example.com /vol/vol1    -sec=sys,rw=clinet1,root=clinet10
nfsserver1.example.com /vol/vol2    -sec=sys,rw=clinet1,root=clinet10
nfsserver1.example.com nfsserver1.example.com /vol/vol1 -sec=sys,rw=clinet1,root=clinet10
nfsserver1.example.com nfsserver1.example.com /vol/vol2 -sec=sys,rw=clinet1,root=clinet10
nfsserver1.example.com nfsserver3.example.com
nfsserver1.example.com nfsserver4.example.com /vol/vol1 -sec=sys,rw=clinet4,root=clinet10

---- nfsserver3.example.com -----------------------------------------
nfsserver3.example.com nfsserver3.example.com
nfsserver3.example.com nfsserver3.example.com
nfsserver3.example.com nfsserver4.example.com /vol/vol1 -sec=sys,rw=clinet4,root=clinet10

---- nfsserver4.example.com -----------------------------------------
nfsserver4.example.com nfsserver4.example.com
nfsserver4.example.com /vol/vol1    -sec=sys,rw=clinet4,root=clinet10
nfsserver4.example.com nfsserver4.example.com /vol/vol1 -sec=sys,rw=clinet4,root=clinet10

---- nfsserver3.example.com -----------------------------------------
nfsserver3.example.com nfsserver3.example.com
nfsserver3.example.com nfsserver3.example.com
nfsserver3.example.com nfsserver4.example.com /vol/vol1 -sec=sys,rw=clinet4,root=clinet10

Beaucoup de lignes dont je n'ai pas besoin. Je ne sais pas vraiment d'où elles viennent.

1voto

Ed Morton Points 25374
$ awk '
    NF==1 && /[^=]/ { srvr=$0; done=0 }
    NF==2 { print srvr, $0; done=1 }
    !NF && !done { print srvr }
    END{ if (!done) print srvr }
' file
nfsserver1.example.com /vol/vol1   -sec=sys,rw=clinet1,root=clinet10
nfsserver1.example.com /vol/vol2   -sec=sys,rw=clinet1,root=clinet10
nfsserver3.example.com
nfsserver4.example.com /vol/vol1   -sec=sys,rw=clinet4,root=clinet10

Toute la sortie supplémentaire que vous obtenez est due au fait que vous avez appelé awk plusieurs fois et que vous avez enveloppé les appels dans une boucle shell pour une raison quelconque.

0voto

RomanPerekhrest Points 54365

Awk solution :

awk -v RS='==+\n' \
'/^nfsserver/{ k = $1; n = NR + 1 }
 NR == n{ 
     gsub(/^[[:space:]]*|[[:space:]]*$/, "", $0);
     len = split($0, a, "\n");
     if (!len) len = 1;
     for (i=1; i<=len; i++) print k, a[i]
}' file.txt

Le résultat :

nfsserver1.example.com /vol/vol1   -sec=sys,rw=clinet1,root=clinet10
nfsserver1.example.com /vol/vol2   -sec=sys,rw=clinet1,root=clinet10
nfsserver3.example.com 
nfsserver4.example.com /vol/vol1   -sec=sys,rw=clinet4,root=clinet10

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X