2009-06-02 10 views
1

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

例:私はラインで始まり、このセクションから.tnsnames.ora からホストとポートをexctractたい105

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

答えて

1

使用:「105をsedの

、$ < SED何でもあなたがここに欲しいコード>」

あなたが特にホストとポートを使用する場合は、あなたのような何かを行うことができます。

sed .tnsnames.ora '105,115p'|grep -e 'host=' -e 'port=' 
1

アドレス範囲を使用して、正規表現を適用するセクションを指定できます。エンド・ライン・アドレスを残しておくと(コンマをつけたままにしておくと)、ファイルの最後に一致します。また、-eを複数回使用して複数の式を「連鎖」することもできます。次の式はポートとホストの値を標準出力に出力します。一致する部分を印刷するために、後方参照(\ 1)を使用します。

sed -n -e '105,115s/(port=\([0-9].*\))/\1/p' -e '105,115s/(host=\([0-9\.].*\))/\1/p' tnsnames.ora 
1

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

'$ 0 = $ 2'は常にtrueです。このスクリプトは自動的に$ 2を出力します。あなたが投稿の答えに対処するための

$ gawk -F'[()]' 'NR>105&&NR<115&&(/host/||/port/)&&$0=$2' .tnsnames.ora 
0

@lkは、:

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

あなたがgawknawkをお持ちの場合博文斎藤は

gawk -F'[()=]' ' 
    NR < 105 {next} 
    NR > 115 {exit} 
    $2 == "host" || $2 == "port" { 
     # do stuff with $2 and $3 
     print $2 "=" $3 
    } 
' 
を言ったように、フィールド区切りが EREある
関連する問題