4

ローカルアプリで使用されているデータベースが実行されているノードを特定する必要があるスクリプトに取り組んでいます。私はこれを、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の開始であるため、どのように検出されないのかわかりません。

4

6 に答える 6

0

私のシステムでは、ホスト名に等号(またはホスト名の実際の文字通りの単語HOST)がない限り、これを使用してホストを取得できます。

エコー$TNS_STRING| sed's/。HOST // g'| sed's /)。// g'| sed's / = // g'| sed's / \ s * // g'

于 2012-05-17T21:20:04.793 に答える
0

ファイルを解析する代わりに、の出力に依存する方がよい場合がありtnspingます。tnsping は、1 行で説明を出力するように見えます。

host=$(
  tnsping $db | while read line; do
    if [[ "$line" == *HOST* ]]; then
      s=${line#*HOST=}; s=${s%%)*}; echo "$s"; break
    fi
  done
)
于 2012-05-18T01:37:57.833 に答える
0

$host の値は複数行の値である可能性が高いため、使用する場所で引用符を付ける必要があります。

host=$(awk -v db=$db "/${db}/ {for(i=1; i<=5; i++) {getline; print}}" tnsnames.ora)
echo "$host"

また、出力を (コマンド置換を使用して) キャプチャする必要があります。$(...)

host=$(echo "$host" | sed 's/Host\s=\s\([a-z]+[0-9]?\)/\1/')
echo "$host"

(そしてそれをエコーする)ので、次のように処理できますsed

改訂

host=$(echo $host | sed 's/.*Host=//; s/).*$//)
echo "$host"

$hostデータに改行を入れたくないので、dbl-quotes なしでjust に戻しました。これですべてが 1 つの大きな文字列になり、正規表現は まですべてを削除し、最初に残ったcharhost=の後のすべてを削除します。)

それでもエラー メッセージが表示される場合は、tnsnames.ora レコードにアクセスできないため、クエリを編集して有効なレコードを含めてください。

これが役立つことを願っています。

于 2012-05-17T21:23:24.200 に答える
0

これはあなたのために働くかもしれません:

db=spurs
host=$(sed '/^(/,/^)/!d;/^(/{h;d};H;/^)/!d;g;/'"$db"'/!d;s/.*Host=\([^)]*\).*/\1/' tnsnames.ora)
于 2012-05-19T15:01:10.200 に答える
-2

テスト済みコード:

OIFS=$IFS;
IFS="(";
tns=`tnsping TNS_ALIAS`
tns_arr=($tns);
tns_info=(`(for ((i=0; i<${#tns_arr[@]}; ++i)); do  echo "${tns_arr[$i]/)/}"; done)| grep 'HOST\|PORT'|sed 's/)//g'|sed 's/ //g'`)
for ((i=0; i<${#tns_info[@]}; ++i)); do eval "export ${tns_info[$i]}"; done
echo "host:" $HOST
echo "port:" $PORT
IFS=$OIFS;
于 2016-02-29T06:55:11.733 に答える