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