2017-11-23 5 views
1

各ホストにどのアプリケーションがデプロイされているか表示しようとしています。 bashスクリプトを使用して、以下の "hostname"部分を$ {i}変数の下に格納されている実際のホスト名に置き換えることを除いて、いくつかの成功を収めました。私は別のものの中に中かっこを入れることができないので、私はそれを置き換えることはできません。私はそれを行うことができますが、$ {i}がlsの結果に置き換えられるので、私はまだ問題を抱えています。これをどうやって解決するのですか?awkを使用して変数をlsコマンドの結果に置き換えよう

---usa01--- 
hostname:E2.gui 
hostname:E1.server 
---london2--- 
hostname:E1.gui 

所望の出力:上記のコードフラグメントに基づく

hosts=(usa1 london2) 
for i in ${hosts[@]}; do 
    echo ---${i}--- 
    ssh [email protected]${i} ls /apps | awk '{ printf("%s:%s\n", "hostname", $0) }' 
done 

電流出力、イントロの注意点としては

---usa01--- 
usa01:E2.gui 
usa01:E1.server 
---london2--- 
london2:E1.gui 

答えて

1

は、それが安全ではない限り、二重引用符なしの配列名を拡張できません明らかな理由から、引用符で囲まれた文字列を配列に分割すると、スペース自体に空白が入ります。

は、だからあなたの問題に来て、今

for i in "${hosts[@]}"; # Note the quoted array 

for i in ${hosts[@]}; 

を変更するには、その-vパラメータを使用してのawkにbashの変数を渡すことができます。だから、ここではawk変数hnameにシェルパラメータ${i}を渡す

ssh [email protected]${i} ls /apps | awk -v hname="${i}" '{ printf("%s:%s\n", hname, $0) }' 

ssh [email protected]${i} ls /apps | awk '{ printf("%s:%s\n", "hostname", $0) }' 

を変更。

側注[ here ]述べた理由のためls出力を解析しないでください。あなたのケースでは、それは違いをほとんどしません。

1

は交換してください:

awk '{ printf("%s:%s\n", "hostname", $0) }' 

で:

awk -v h="$i" '{ printf("%s:%s\n", h, $0) }' 

-v h="$i" awkの変数hを作成して、シェル変数$iの値を割り当てるためのawkに指示します。別に

:あなたがシェルが単語分割パス名展開を実行する場合を除き、二重引用符内でシェル変数を置くことをお勧めですので、我々はh="$i"ではなくh=$iを使用。

関連する問題