2015-04-06 69 views
0

我执行以下命令awk将值传递给参数 - 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}' 

就是这样,我添加了两个具有相同值的条目但我没有得到任何回报。这是为什么?

这里是/etc/hosts样本:

[email protected]:~# 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 
+0

没有未能从修改后的脚本获得输出的明显原因;你应该得到一些东西,即使它不是你想要的东西。你确定你在正确的文件上运行它吗? 'printf()'末尾都没有换行符;这是你的问题的一个因素?根据您提供的hosts文件运行脚本(不使用我的'/ etc/hosts')会得到合理的结果。 – 2015-04-06 03:24:21

回答

2

摆脱不必要里grep和管道,并把它写成:

$ 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 
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 
+2

诚然,这是一个投票,但不是解释为什么在问题的第二个脚本中没有输出。 – 2015-04-06 03:28:29

+0

你的代码中的anubhava看起来像是在某处出现了一个转义问题:'namenode:ERROR:无法识别的参数:MyCluster' – cybertextron 2015-04-06 05:05:55

+0

实际上,这是我们为我工作的awk命令的复制粘贴。但是,一旦我回到我的电脑上,我会再尝试一次,因为我目前正在使用移动设备。 – anubhava 2015-04-06 05:14:30