Ifとawkを含む(出力コンテンツのフィルタリング)

Ifとawkを含む(出力コンテンツのフィルタリング)

ファイアウォールでいくつかのコマンドを実行し、そのログファイルをいくつかの小さなファイルに分割しました。私のデータファイルMASA1は次のとおりです...

MASA1/pri/act# changeto context admin 
MASA1/pri/act/admin# sh run
[removed]
MASA1/pri/act/admin# sh access-list
[removed]
MASA1/pri/act/admin# changeto context Context1
MASA1/pri/act/Context1# sh run
[removed]
MASA1/pri/act/Context1# sh access-list
[removed]
MASA1/pri/act/Context1# changeto context Context2
MASA1/pri/act/Context2# sh run
[removed]
MASA1/pri/act/Context2# sh access-list
[removed]

以下のスクリプトは機能し、各コンテキストと各コマンド(admin_run、admin_acl、Context1_run、...Context2_aclなど)ごとに別々のファイルを生成します。

sed -e '/# sh /{x;p;x};/\<changeto\>/d' MASA1 | awk -v RS=  -F '[ ]|[#/]' '{if ($0~ /sh run/) {f=$1"_"$4"_run"; print > f} else {if ($0~ /sh access-list/) {f=$1"_"$4"_acl"; print > f}}}'

ただし、スクリプトは全体の構成(時には10,000行以上)を出力します。特定のIPアドレスまたはオブジェクト名に基づいて出力をフィルタリングしたいです。以下を使用して同様の操作を実行できます。

grep -f ファイル名

デバイスは20〜40個のコンテキストを処理しているため、デバイスごとに2つのファイル(_run、_acl)があることを考慮すると、40〜80個の追加ファイルが作成されます。検索にヒットしたファイルだけが保存され、すべての設定ではなく一致する行だけが保存されるようにスクリプトにフィルタを構築したいと思います。

スクリプトがMASA1で始まる2行間のセクション全体を操作する方法は$ 0として扱われます。

if ($0~ /sh 実行/)

または

if ($0~/sh アクセスリスト/)

それでも10000行程度がすべて印刷されます。

スクリプトをもう少し詳しく説明する必要があるようです...

sed -e '/# sh /{x;p;x};/\<changeto\>/d' MASA1

これにより、chnageto行を削除し、追加の行で区切られたセクションが生成されるようにデータファイルを変更します。

MASA1/pri/act/Context1# sh access-list
[removed]

MASA1/pri/act/Context2# sh run
[removed]

MASA1/pri/act/Context2# sh access-list
[removed]

2番目の部分...

awk -v RS=  -F '[ ]|[#/]' '{if ($0~ /sh run/) {f=$1"_"$4"_run"; print > f} else {if ($0~ /sh access-list/) {f=$1"_"$4"_acl"; print > f}}}'

...行にsh runコマンドがある場合、ファイル名はMASA1_Context1_runまたはMASA1_Context2_runになり、sh access-listの場合、ファイル名はMASA1_Context2_aclになります。このコマンドのファイルの内容は、最初の空行まで完全な[removed]セクションになります。

私が望むのは、ゼロ以外の出力でファイルを生成し、[removed]セクション全体ではなく、これらの特定のIPアドレスと一致する行だけを出力することです。

ベストアンサー1

私も理解しているかどうかはわかりませんが、これがあなたにどのように役立つか:

awk '/changeto/ {CTX = $NF} /# sh/ {FN = CTX "_" $NF} !/MASA1/ {print > FN}' file

おすすめ記事