ローカルアプリで使用されているデータベースが実行されているノードを特定する必要があるスクリプトに取り組んでいます。私はこれを、awk / sedを学習し、ステートメントをテストするためのテストスクリプトを作成するように強制する機会として使用しようとしています。スクリプトが置かれているホームフォルダに移動したtnsnames.oraファイルのコピーを処理しています。有効なtnsnames.oraスタンザは次のとおりです。
(
DESCRIPTION = (
ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP) (Host=iplab)(Port=1521))
)
(CONNECT_DATA=(SID=spurs1))
)
いくつかの調査を行い、awk式を取得してtnsエントリを$ hostにプルした後、以下のスクリプトを思いつきましたが、機能していないようです。
#!/bin/ksh
db=spurs
host=$(awk -v db=$db "/${db}/ {for(i=1; i<=5; i++) {getline; print}}" tnsnames.ora)
echo $host
host= $host | sed 's/Host\s=\s\([a-z]+[0-9]?\)/\1/'
echo $host
awkステートメントを実行すると、次のようになります。
(DESCRIPTION = (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP) (Host=hostname)(Port=1521))) (CONNECT_DATA=(SID=spurs1)) )
./tns.ksh: line 6: (DESCRIPTION: not found
(DESCRIPTION = (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP) (Host=hostname)(Port=1521))) (CONNECT_DATA=(SID=spurs1)) )
チュートリアルやフォーラムを読んで見たところ、sedは正しく設定されており、$ hostを1つ以上の小文字に設定し、その後にHost=の後に0または1の数字を設定する必要があると思います。(DESCRIPTIONはsedステートメントの前後の$ hostの開始であるため、どのように検出されないのかわかりません。