将值传递给参数 - awk

时间:2015-04-06 02:34:39

标签: bash shell unix awk grep

我正在执行以下awk命令:

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}'

并返回正确的输出:

/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=$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}'

那就是它,我添加了两个具有相同值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

2 个答案:

答案 0 :(得分:2)

我已尝试过两个命令管道并在两者中获取输出。如您所述,第二个命令管道也没有产生空白输出。

但是,您可以让awk完成所有工作并从命令中完全删除egrep

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

答案 1 :(得分:2)

摆脱不必要的greps和管道并将其写为:

$ 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