求助:使用Awk脚本删除不含指定内容的配置块
解决思路与Awk脚本实现
你的问题核心是没有把整个edit到next的块作为单位处理,之前的命令只是在块内逐行判断,只输出匹配目标配置的行,而非完整块。正确的做法是先缓存整个块,再判断是否符合条件,符合则输出完整块。
实现脚本
创建一个Awk脚本(比如filter_blocks.awk):
# 遇到edit行,初始化块缓存和匹配标记 /^edit/ { block = $0 ORS found = 0 next } # 遇到next行,完成块缓存,判断是否输出 /^next/ { block = block $0 ORS if (found) print block # 重置缓存和标记,准备下一个块 block = "" found = 0 next } # 其他行加入块缓存,同时检查是否包含目标配置 { block = block $0 ORS if ($0 ~ /set associated-interface "interface1"/) { found = 1 } }
使用方法
在终端执行:
awk -f filter_blocks.awk address.fgt
关键逻辑说明
- 块缓存初始化:匹配到
edit开头的行时,开始缓存这个块,同时设置found标记为0(表示未找到目标配置)。 - 块内容收集:后续每一行都加入到
block缓存中,只要遇到目标配置行,就把found标记设为1。 - 块输出判断:匹配到
next行时,当前块结束,此时如果found为1,就输出整个缓存的块内容,然后重置缓存和标记,处理下一个块。
适配缩进场景
如果你的配置文件中edit或next前面有空格(比如缩进),可以把正则调整为匹配带空白字符的情况:
/^[[:space:]]*edit/ { ... } /^[[:space:]]*next/ { ... }
内容的提问来源于stack exchange,提问作者pacionet
相关产品推荐
相关产品推荐

