嵌入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}}}'

但是该脚本将输出整个配置(有时 10000 行甚至更多)。我想按特定 IP 地址或对象名称过滤输出。类似的事情可以用

grep -f 文件名

由于我正在处理设备上的 20-40 个上下文,考虑到每个设备有两个文件(_run、_acl),这将导致 40-80 个额外文件。我想将过滤器构建到脚本中,以便仅保存搜索命中的那些文件,并且仅保存匹配的行而不是所有配置。

脚本如何工作的方式以 MASA1 开头的两行之间的整个部分将被视为 $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]

第二部分...

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。该命令下的文件内容将是整个[删除]部分,直到第一个空行。

我想做的只是创建文件,输出不为零,并且只输出与这些特定 IP 地址匹配的行,而不是整个 [removed] 部分。

答案1

也不确定我是否理解,但这会让你走多远:

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

相关内容