行と形式の選択

行と形式の選択

1行目と「規則」の名前が宣言された対応する行だけを印刷するように、次の出力形式を指定する方法はありますか?構成によっては、「ルール」の行が異なる場合があります。 4、5、8行などになります。示されているように、ルール名は括弧内にあります。以下の「必須出力」の例に示すように、最初の行がルール行とともに表示されるのが最善です。

注文する:show virtual server

生出力:

adc virtual name_of_virtual_server {
    output
    destination 10.201.111.101:80
    ip-protocol tcp
    mask 255.255.255.255
    pool test
    profiles {
        test {
            context clientside
        }
        test { }
        test data {
            context serverside
        }
    }
    rules {
        Exchange__all_services2.dat/Exchange__all_services2_rule7
    }
    source 0.0.0.0/0
    source-address-translation {
        pool data_pool
        type snat
    }
    vs-index 13
}

希望の出力:

name_of_virtual_server
rules {
     Exchange__all_services2.dat/Exchange__all_services2_rule7

または - より良い - アイテムの間に空白行を置くことをお勧めします。

Name: name_of_virtual_server
Rule: Exchange__all_services2.dat/Exchange__all_services2_rule7

sedまたはawkを使用してこれを達成できますか?重要な場合は、1つの構成ファイルに何百もの仮想サーバー構成がある可能性があることに注意してください。

答え1

これはPerlのメソッドです:

perl -ne 'if (/^adc\s+\w+\s+(\w+)/) { print "Name: $1\n" }
          elsif (/^\s*rules\s*{/) { $inrule = 1; }
          elsif (/}/) { $inrule = 0; }
          elsif (/^\s*(\S*)/) { print "Rule: $1\n" if $inrule; }'

ファイル内の各行を調べてName:1行が表示された場合は、1行を印刷してからadcチャンク rules {}を識別できませんでしたRule:

入力形式に適したパーサーを使用する方が強力です。レイアウトが問題と正確に一致しない場合、この行は壊れます。

答え2

ファイルのファイル形式に合ったパーサーがあれば、それを使用しなければならない。これが欠落している場合、サンプル入力に適した解決策は次のとおりです。

$ awk '/^adc/{print "name:",$3} /^[[:space:]]*rules/{getline;print "rule:",$1}' file
name: name_of_virtual_server
rule: Exchange__all_services2.dat/Exchange__all_services2_rule7

どのように動作しますか?

  • /^adc/{print "name:",$3}

    で始まる行の場合は、その行の3番目の項目をadc印刷してください。name:

  • /^[[:space:]]*rules/{getline;print "rule:",$1}

    空白(オプション)で始まり、後に続く行の場合は、次の行rulesの最初の項目が印刷されます。

関連情報