2

sed/awk の特定の範囲の行から特定の変数を抽出するにはどうすればよいですか?

例: 105 行目から始まるこのセクションから、.tnsnames.ora からホストとポートを抽出します。

DB_CONNECTION=
   (description=
     (address=
         (protocol=tcp)
         (host=127.0.0.1)
         (port=1234)
      )
      (connect_data=
         (sid=ABCD)
         (sdu=4321)
  )
4

4 に答える 4

2

gawk は、フィールドセパレーター (FS) で正規表現を使用できます。

'$0=$2' は常に true であるため、このスクリプトは自動的に $2 を出力します。

$ gawk -F'[()]' 'NR>105&&NR<115&&(/host/||/port/)&&$0=$2' .tnsnames.ora
于 2009-06-02T13:25:30.507 に答える
1

アドレス範囲を使用して、正規表現を適用するセクションを指定できます。終了行アドレスを省略した場合 (カンマを残す)、ファイルの末尾に一致します。「-e」を複数回使用して、複数の式を「チェーン」することもできます。次の式は、ポートとホストの値を標準出力に出力するだけです。一致する部分だけを印刷するために、後方参照 (\1) を使用します。

sed -n -e '105,115s/(port=\([0-9].*\))/\1/p' -e '105,115s/(host=\([0-9\.].*\))/\1/p' tnsnames.ora 
于 2009-06-02T09:47:51.600 に答える
1

@lk、投稿した回答に対処するには:

C のように awk コードを書くこともできますが、それは「パターン {アクション}」のペアとしてより簡潔に表現されます。

gawkまたはnawkを使用している場合、齋藤博文が言ったように、フィールド区切り文字はEREです。

gawk -F'[()=]' '
    NR < 105 {next}
    NR > 115 {exit}
    $2 == "host" || $2 == "port" {
        # do stuff with $2 and $3
        print $2 "=" $3
    } 
'
于 2009-06-02T18:02:18.640 に答える