passer des valeurs aux arguments – awk

awk commande awk suivante:

 egrep '^[0-9]' /etc/hosts | grep -v 127.0.0.1 \ | awk 'NR==1{ips=$1} NR>1{ips=ips ", " $1} $2=="namenode"{nn=$1} END{ printf "/opt/mapr/server/configure.sh -C %s -Z %s -N mycluster --create-user -D /dev/xvdb", ips, nn}' 

Et renvoie la sortie correcte:

 /opt/mapr/server/configure.sh -C 10.224.43.50, 10.40.235.23 -Z 10.40.235.23 -N mycluster --create-user -D /dev/xvdb 

Maintenant je deviens plus intelligent et essaye de suivre le modèle:

 egrep '^[0-9]' /etc/hosts | grep -v 127.0.0.1 \ | awk 'NR==1{ips=$1} NR>1{ips=ips ", " $1} $2=="namenode"{nn=$1} END{ printf "/opt/mapr/server/configure.sh -C %s -Z %s -RM %s -HS %s -N mycluster --create-user -D /dev/xvdb", ips, nn, nn, nn}' 

C’est ça, j’ai ajouté deux entrées supplémentaires avec la même valeur de nn mais je n’ai rien récupéré. Pourquoi donc?

Voici un exemple de /etc/hosts :

 root@ip-10-40-235-23:~# cat /etc/hosts 127.0.0.1 localhost # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts ## vagrant-hostmanager-start 10.224.43.50 dgnode dgnode.dg.local 10.40.235.23 namenode namenode.dg.local ## vagrant-hostmanager-end 

Débarrassez-vous des greps et des tuyaux inutiles et écrivez-le comme suit:

 $ cat tst.awk /^[0-9]/ && !/127\.0\.0\.1/ { ips = (ips ? ips ", " : "") $1 if ($2=="namenode") { nn = $1 } } END { printf "/opt/mapr/server/configure.sh -C %s -Z %s -RM %s -HS %s -N mycluster --create-user -D /dev/xvdb\n", ips, nn, nn, nn } $ awk -f tst.awk file /opt/mapr/server/configure.sh -C 10.224.43.50, 10.40.235.23 -Z 10.40.235.23 -RM 10.40.235.23 -HS 10.40.235.23 -N mycluster --create-user -D /dev/xvdb 

J’ai essayé les deux pipelines de commande et obtenu une sortie dans les deux. Le deuxième pipeline de commandes ne produit pas non plus de données vierges comme vous l’avez mentionné en question.

Cependant, vous pouvez faire en sorte que awk fasse tout le travail et supprimer complètement egrep de votre commande:

 awk '/127\.0\.0\.1/ || !/^[0-9]/{next} !ips{ips=$1; next} {ips=ips ", " $1} $2=="namenode"{nn=$1} END{ printf "/opt/mapr/server/configure.sh -C %s -Z %s -RM %s -HS %s -N mycluster --create-user -D /dev/xvdb", ips, nn, nn, nn }' /etc/hosts