将值传递给参数 - awk
passing values to arguments - awk
我正在执行以下 awk
命令:
egrep '^[0-9]' /etc/hosts | grep -v 127.0.0.1 \
| awk 'NR==1{ips=}
NR>1{ips=ips ", " }
=="namenode"{nn=}
END{ printf "/opt/mapr/server/configure.sh -C %s -Z %s -N mycluster --create-user -D /dev/xvdb", ips, nn}'
和returns正确的输出:
/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
现在我变得更聪明并尝试遵循以下模式:
egrep '^[0-9]' /etc/hosts | grep -v 127.0.0.1 \
| awk 'NR==1{ips=}
NR>1{ips=ips ", " }
=="namenode"{nn=}
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}'
就是这样,我又添加了两个具有相同值 nn
的条目,但我什么也没得到。这是为什么?
这是 /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
我已经尝试了您的两个命令管道并在两者中都获得了输出。正如您在问题中提到的那样,第二个命令管道也没有产生空白输出。
但是您可以让 awk
完成所有工作并从您的命令中完全删除 egrep
:
awk '/127\.0\.0\.1/ || !/^[0-9]/{next}
!ips{ips=; next}
{ips=ips ", " }
=="namenode"{nn=}
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
去掉不必要的 greps 和管道,写成:
$ cat tst.awk
/^[0-9]/ && !/127\.0\.0\.1/ {
ips = (ips ? ips ", " : "")
if (=="namenode") {
nn =
}
}
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
我正在执行以下 awk
命令:
egrep '^[0-9]' /etc/hosts | grep -v 127.0.0.1 \
| awk 'NR==1{ips=}
NR>1{ips=ips ", " }
=="namenode"{nn=}
END{ printf "/opt/mapr/server/configure.sh -C %s -Z %s -N mycluster --create-user -D /dev/xvdb", ips, nn}'
和returns正确的输出:
/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
现在我变得更聪明并尝试遵循以下模式:
egrep '^[0-9]' /etc/hosts | grep -v 127.0.0.1 \
| awk 'NR==1{ips=}
NR>1{ips=ips ", " }
=="namenode"{nn=}
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}'
就是这样,我又添加了两个具有相同值 nn
的条目,但我什么也没得到。这是为什么?
这是 /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
我已经尝试了您的两个命令管道并在两者中都获得了输出。正如您在问题中提到的那样,第二个命令管道也没有产生空白输出。
但是您可以让 awk
完成所有工作并从您的命令中完全删除 egrep
:
awk '/127\.0\.0\.1/ || !/^[0-9]/{next}
!ips{ips=; next}
{ips=ips ", " }
=="namenode"{nn=}
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
去掉不必要的 greps 和管道,写成:
$ cat tst.awk
/^[0-9]/ && !/127\.0\.0\.1/ {
ips = (ips ? ips ", " : "")
if (=="namenode") {
nn =
}
}
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