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

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

问题分析

  1. 语法错误:Shebang行末尾多了一个反引号`,导致脚本执行时解析异常。
  2. 字段分隔符设置不合理:FS="[:/]"无法正确处理原始文本中冒号后带空格的格式(如Diameter link name: PGW_TO_DRA),导致字段提取错误。
  3. 字段收集逻辑缺失:脚本遇到Dest IP就立即输出,但未确保收集完当前链路的所有字段(如VRF、Protocol),且未处理多链路的块分隔(通常链路间用空行分隔)。
  4. 输出字段不匹配:表头定义了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:02:03