2015-04-06 97 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