2016-04-19 180 views
0

從命令行運行ssh行時,它起作用。AWK在bash中不起作用腳本

從一個bash腳本,它顯示爲:(awk命令裏面$變量是空的)

ssh [email protected] netstat --tcp| grep 'servervip3'| grep 'ldap'| awk ' == ESTABLISHED'| awk '{print }'| awk -F: '{print }' >>/somepath/somefile.txt 

腳本部分:

for ((i=0; i<${arraylength}; ++i)) 
    do 
     # drop all beyond first period in SSH_ADDRESS[i] and add vip3 
     host_grep="`echo ${SSH_ADDRESS[i]}|awk -F. '{ print $1 }'`vip3" 
     ssh [email protected]${SSH_ADDRESS[i]} netstat --tcp| grep '$host_grep'| grep 'ldap'| awk '$6 == "ESTABLISHED"'| awk '{print $5}'| awk -F: '{print $1}' >>$seed_file 

done 

任何想法?謝謝-jim

+1

更改'grep'$ host_grep''爲'grep'$ host_grep「' – anishsane

+0

另外,您不應該需要一個awk&grep如此之多的管道。單個awk應該可以做到。但是,這是優化的一部分。 – anishsane

+0

那麼'grep'和'awk'鏈接怎麼樣?這似乎相當不必要。 –

回答

2

對您的原始命令做了一些小的優化,如下強大的劑量awk。我已將2個grep實例和一個awk合併成一個。

ssh [email protected]${SSH_ADDRESS[i]} netstat --tcp | awk -v host="$host_grep" '(/host/ || /ldap/) && $6 == "ESTABLISHED" {print $5}' | awk -F: '{print $1}' >>$seed_file 

我會解釋這是如何工作的: -

  1. 存儲的主機名來搜索作爲awk變量-v host="$host_grep"因此,這將是在regex比賽有用。
  2. (/host/ || /ldap/) && $6 == "ESTABLISHED"匹配具有任一主機爲存儲在$host_grep或包含關鍵字ldap和具有柱6倍的值作爲"ESTABLISHED"
  3. awk -F: '{print $1}'使用:限定您的字符串和之前它打印的值的任何行。