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
の最初の項目が印刷されます。