AWK脚本转换Diameter链路信息为CSV格式失败求助
Diameter链路信息转CSV的AWK脚本问题排查与修复
问题描述
有一份包含多条Diameter链路信息的文本文件(30.txt),涵盖链路名称、状态、协议、VRF、本地/目标IP及端口等信息,需要转换为规范的CSV格式。编写的AWK脚本执行后输出不符合预期,具体如下:
原始脚本(parsing.sh)
$ cat parsing.sh #!/bin/bash` awk ' BEGIN { RS="\n";FS="[:/]"; OFS="," } NR==1 { print "PGW,Peer,IP PGW,Port PGW,IP DRA,Port DRA,vrf,Protocol" } /Diameter link name/ { tm = sprintf("%s",$2) } /Local IP/ { pl = sprintf("%s,%s",$3,$4) } /Dest IP/ { printf("%s,%s,%s,%s\n",tm,pl,$3,$4) } ' 30.txt
错误输出
$ ./parsing.sh PGW,Peer,IP PGW,Port PGW,IP DRA,Port DRA,vrf,Protocol , 172.31.216.66,2414
问题分析
- 语法错误:Shebang行末尾多了一个反引号`,导致脚本执行时解析异常。
- 字段分隔符设置不合理:
FS="[:/]"无法正确处理原始文本中冒号后带空格的格式(如Diameter link name: PGW_TO_DRA),导致字段提取错误。 - 字段收集逻辑缺失:脚本遇到
Dest IP就立即输出,但未确保收集完当前链路的所有字段(如VRF、Protocol),且未处理多链路的块分隔(通常链路间用空行分隔)。 - 输出字段不匹配:表头定义了8个字段,但
printf仅输出4个,导致列对齐混乱,且缺失VRF、Protocol等关键字段。
修复后的脚本
假设30.txt的内容格式如下(典型的Diameter链路信息块):
Diameter link name: PGW_TO_DRA_1 State: Up Protocol: SCTP VRF: vrf_pgw Local IP: 172.31.216.65/3868 Dest IP: 172.31.216.66/2414 Diameter link name: PGW_TO_DRA_2 State: Down Protocol: TCP VRF: vrf_pgw_backup Local IP: 172.31.216.67/3868 Dest IP: 172.31.216.68/2414
修正后的parsing.sh脚本:
#!/bin/bash awk ' BEGIN { OFS="," # 输出CSV表头 print "PGW,Peer,IP PGW,Port PGW,IP DRA,Port DRA,vrf,Protocol" } # 空行作为链路块分隔符,输出当前链路信息并重置变量 /^$/ { if (link_name != "" && local_ip != "" && dest_ip != "") { # 拆分IP/端口字符串 split(local_ip, local_parts, "/") split(dest_ip, dest_parts, "/") # 输出完整字段(Peer字段暂为空,可根据需求补充) print link_name, "", local_parts[1], local_parts[2], dest_parts[1], dest_parts[2], vrf, protocol } # 重置变量,准备收集下一条链路 link_name = local_ip = dest_ip = vrf = protocol = "" next } # 提取各字段信息 /Diameter link name/ { link_name = $3 } /Local IP/ { local_ip = $3 } /Dest IP/ { dest_ip = $3 } /VRF/ { vrf = $2 } /Protocol/ { protocol = $2 } # 处理文件末尾无空行的情况,确保最后一条链路输出 END { if (link_name != "" && local_ip != "" && dest_ip != "") { split(local_ip, local_parts, "/") split(dest_ip, dest_parts, "/") print link_name, "", local_parts[1], local_parts[2], dest_parts[1], dest_parts[2], vrf, protocol } }' 30.txt
预期输出
PGW,Peer,IP PGW,Port PGW,IP DRA,Port DRA,vrf,Protocol PGW_TO_DRA_1,,172.31.216.65,3868,172.31.216.66,2414,vrf_pgw,SCTP PGW_TO_DRA_2,,172.31.216.67,3868,172.31.216.68,2414,vrf_pgw_backup,TCP
内容的提问来源于stack exchange,提问作者Wolverine adamantium
相关产品推荐
相关产品推荐

