如何用bash脚本识别层级配置文件中最靠左的非exit配置条目行
层级配置表头行识别实现方案
结论
完全可以实现,单独用awk就可以满足需求,sed和grep因不擅长状态记录、数值比较,单独使用难以实现该逻辑。
实现逻辑
你的需求可以拆解为3个可被awk直接处理的判断规则:
- 跳过全内容为
exit的行(前后可带空格) - 统计每行开头的连续空格数量,记录当前分组内的最小空格值
- 同分组内空格数等于最小值的行即为目标表头行
脚本示例
单组配置场景(整份配置为一个大分组)
直接统计全局最小前置空格数,输出匹配的行即可:
awk ' # 跳过所有内容为exit的行 /^[[:space:]]*exit[[:space:]]*$/ {next} { # 计算当前行前置空格长度 match($0, /^[[:space:]]*/) cur_spaces = RLENGTH # 更新全局最小空格数 if (NR == 1 || cur_spaces < min_spaces) { min_spaces = cur_spaces } # 缓存行内容和对应空格数 lines[NR] = $0 space_cnt[NR] = cur_spaces } END { # 遍历输出所有符合要求的表头行 for (i=1; i<=NR; i++) { if (space_cnt[i] == min_spaces) { print lines[i] } } } ' 你的配置文件路径
该脚本可直接适配你给出的两个示例:
- 第一份配置中两条
vpls 266X customer 1 v-vpls vlan 266X create开头的行前置空格最少,会被正常输出 - 第二份配置中
port vlan-port:x/x/x/x/x/x/x/x开头的行无前置空格,为全局最小值,会被正常输出
多组配置场景(配置内有多个独立分组)
如果你的配置存在多个独立分组(比如分组之间用空行分隔),可以用以下版本,按分组统计最小空格数:
BEGIN {min_spaces = 9999} # 遇到空行判定为当前分组结束,输出当前分组的表头行后重置变量 /^[[:space:]]*$/ { for (i in group_lines) { if (group_space[i] == min_spaces) { print group_lines[i] } } delete group_lines delete group_space min_spaces = 9999 next } /^[[:space:]]*exit[[:space:]]*$/ {next} { match($0, /^[[:space:]]*/) cur_spaces = RLENGTH group_lines[length(group_lines)+1] = $0 group_space[length(group_space)+1] = cur_spaces if (cur_spaces < min_spaces) min_spaces = cur_spaces } # 处理最后一个无空行收尾的分组 END { for (i in group_lines) { if (group_space[i] == min_spaces) { print group_lines[i] } } } ' 你的配置文件路径
如果你的分组有其他分隔规则,只需修改分组判定的对应逻辑即可,核心匹配逻辑无需调整。
内容的提问来源于stack exchange,提问作者Fernando Iñiguez
相关产品推荐
相关产品推荐

