You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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]
        }
    }
}
' 你的配置文件路径

该脚本可直接适配你给出的两个示例:

  1. 第一份配置中两条vpls 266X customer 1 v-vpls vlan 266X create开头的行前置空格最少,会被正常输出
  2. 第二份配置中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:39:03