如何在PowerShell中按标签精准解析FIX 4.4协议结构化日志
PowerShell 解析FIX 4.4结构化日志方案
实现思路
原有固定索引拆分的方式无法适配字段顺序变动、标签间无空格、重复标签的场景,改用正则精准匹配FIX协议的「数字标签=取值」结构,直接按标签号定位取值,同时自动收集重复标签的所有内容,步骤如下:
- 首先拆分每行
:分隔符前的内容作为开头时间戳 - 对分隔符后的FIX报文内容,用正则匹配所有标签键值对,兼容标签连写无空格、字段顺序随机的情况
- 对重复出现的标签(如270、271),按出现顺序存储所有取值
- 按需求顺序拼接时间戳和目标标签的取值,输出格式化结果
完整实现代码
# 配置参数:修改为实际日志路径、需要提取的标签编号(按输出顺序排列) $logFilePath = "FIX.log" $extractTags = @(55, 270, 271) # FIX标签匹配正则:兼容标签间无空格、多重复标签场景 $tagMatchRegex = [regex]'(\d+)=([^=]+?)(?=\s*\d+=|$)' Get-Content $logFilePath | ForEach-Object { # 跳过空行 if ([string]::IsNullOrWhiteSpace($_)) { return } # 提取行首时间戳 $lineSplitRes = $_ -split ' : ', 2 $timeStamp = $lineSplitRes[0].Trim() $fixContent = $lineSplitRes[1] # 存储标签值:键为标签号,值为该标签所有取值的数组(按报文出现顺序保存) $tagValueMap = @{} $allTagMatches = $tagMatchRegex.Matches($fixContent) foreach ($match in $allTagMatches) { $tagId = [int]$match.Groups[1].Value $tagVal = $match.Groups[2].Value.Trim() if (-not $tagValueMap.ContainsKey($tagId)) { $tagValueMap[$tagId] = @() } $tagValueMap[$tagId] += $tagVal } # 拼接输出结果 $resultParts = @($timeStamp) foreach ($tag in $extractTags) { if ($tagValueMap.ContainsKey($tag)) { $resultParts += $tagValueMap[$tag] } } $resultParts -join ' ' }
效果说明
用提供的示例日志行运行代码,输出结果完全符合预期:
20220606-21:10:21.930 US30 32921.6 2000000 32931.4 2000000
方案不依赖字段固定位置,后续如果需要提取其他标签(比如49、56、35这类),只需要修改$extractTags数组里的标签编号即可,不需要调整核心解析逻辑。
内容的提问来源于stack exchange,提问作者mart
相关产品推荐
相关产品推荐

