3行を一緒に処理し、行の最後まで区切り文字が見つかるまでプロセスを繰り返します。

3行を一緒に処理し、行の最後まで区切り文字が見つかるまでプロセスを繰り返します。

クラスタの状態を確認し、問題が見つかった場合は、出力の3つの属性を取得し、その情報をイベント管理システムに送信するシナリオがあります。

出力は次のとおりです。

          Name : host1.domain.com
       Address : 10.10.10.1
Overall Health : DISK_ERROR
--
          Name : host2.domain.com
       Address : 10.10.10.2
Overall Health : MEMORY_ERROR
--
          Name : host3.domain.com
       Address : 10.10.10.3
Overall Health : HEALTH_GOOD
--

私が望むのは、各行を取得し、コロンの右側にある値を取得し、各値を変数に割り当て、それをイベント「メッセージ」に渡すことです。その後、スクリプトがダッシュ(または私が設定できる他の区切り文字)に達したら、再起動して別のイベント「メッセージ」を生成し、失敗したクラスタメンバー全体について繰り返します。

これがforまたはwhileループのように見えますが、どのように設定する必要があるかはわかりません。最終結果は次のとおりです。

var1=host1.domain.com var2=10.10.10.1 var3=DISK_ERROR

message -remote_host -port -msg "The host $var1 at IP $var2 is experiencing an issue of a $var3"

先週は多くの検索を行いましたが、その例を見たことがありません。リストを繰り返すのが1つのようです。区切り文字に基づいてリストを終了することは似ていますが、出力から複数の変数を生成し、それをエコーまたは外部タスクタイプに追加するタスクの例を見たことはありません。その後、再起動して、同じ出力の異なるデータセットを使用して同じシーンを再作成します。ファイルごとにファイルを書き、各ファイルを処理するのがわかりますが(該当する場合)、現時点では私が必要とする作業を効率的に行う方法がわかりません。これは不可能かもしれませんが、データを操作する最善の方法についてアドバイスをいただきありがとうございます。

答え1

awkで素早く実装してください。

awk -F ' *: *' '$1 ~ /Name/ { n = $2 } $1 ~ /Address/ { a = $2 } $1 ~ /Overall Health/ { m = $2 } /^--$/ {printf "The host %s at IP %s is experiencing an issue of a %s\n", n, a, m}'

コマンドはこのコマンドにパイプすることができ、ファイルからデータを読み取るには、コマンドの最後にファイル名を入力します。 (作成したとおりに標準入力の入力を待ちます。)

関連情報