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

如何在Bash中将多行数据按FromPort分组转换为单行列格式?

Bash解决方案:按FromPort分组合并多行规则为单行

需求说明

将包含FromPort、CidrIp、CidrIpv6字段的多行规则数据,按FromPort分组,每个端口对应的所有相关字段合并到同一行。

原始数据

"FromPort": 80,
"CidrIp": "10.0.0.0/8",
"CidrIp": "XX.XX.XX.XX/32",
"CidrIp": "XX.XX.XX.XX/32",
"CidrIp": "XX.XX.XX.XX/32",
"FromPort": 443,
"CidrIp": "0.0.0.0/0",
"CidrIpv6": "::/0",

期望输出

"FromPort": 80, "CidrIp": "10.0.0.0/8", "CidrIp": "XX.XX.XX.XX/32", "CidrIp": "XX.XX.XX.XX/32", "CidrIp": "XX.XX.XX.XX/32",

"FromPort": 443, "CidrIp": "0.0.0.0/0", "CidrIpv6": "::/0",

解决方案

使用awk脚本高效完成分组与行合并:

awk '
/^"FromPort"/ {
    if (line != "") {
        print line ","
        print ""
    }
    line = $0
    next
}
{
    line = line " " $0
}
END {
    if (line != "") {
        print line ","
    }
}
' rules.txt

脚本说明

  1. 匹配到FromPort行时:
    • 若已有积累的分组内容,先打印该行并追加逗号,再输出空行分隔不同端口组
    • 将当前FromPort行设为新分组的起始行
  2. 非FromPort行直接追加到当前分组行末尾,用空格分隔
  3. 脚本结束时,打印最后一个分组的内容

如果需要从标准输入读取数据(如通过管道),可这样使用:

cat rules.txt | awk '
/^"FromPort"/ {
    if (line != "") {
        print line ","
        print ""
    }
    line = $0
    next
}
{
    line = line " " $0
}
END {
    if (line != "") {
        print line ","
    }
}
'

内容的提问来源于stack exchange,提问作者Ayush Agarwal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:48:20