如何在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
脚本说明
- 匹配到
FromPort行时:- 若已有积累的分组内容,先打印该行并追加逗号,再输出空行分隔不同端口组
- 将当前
FromPort行设为新分组的起始行
- 非
FromPort行直接追加到当前分组行末尾,用空格分隔 - 脚本结束时,打印最后一个分组的内容
如果需要从标准输入读取数据(如通过管道),可这样使用:
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
相关产品推荐
相关产品推荐

