2016-04-19 12 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を1つにまとめました。

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. ストアそれはregex試合に有用であろうように、awk変数-v host="$host_grep"として検索するホスト名。
  2. (/host/ || /ldap/) && $6 == "ESTABLISHED"
  3. $host_grepに保存されているか、キーワード ldapを含有し、 "ESTABLISHED"
  4. awk -F: '{print $1}':を使用して文字列を区切り、その前の値を出力して、列6つの値を有するように、ホストのいずれかを持っている任意の行に一致します。
関連する問題