使用PowerShell和正则表达式将字符串解析为自定义PSCustomObject数组
解决方案
你要解析的是飞塔防火墙的标准key=value格式日志,无需为每个字段单独编写正则捕获组,用通用规则匹配所有键值对即可自动生成PSCustomObject,实现代码如下:
# 通用键值对匹配正则:匹配 键=值 格式,值支持引号包裹或无引号非空格内容 $kvPattern = '(\w+)=(".*?"|\S+)' $logObjects = $cmd | ForEach-Object { # 初始化有序哈希表存储键值对 $logHash = [ordered]@{} # 匹配当前日志行的所有键值对 $matchResult = [regex]::Matches($_, $kvPattern) foreach ($m in $matchResult) { $key = $m.Groups[1].Value # 去除值两端的双引号 $value = $m.Groups[2].Value.Trim('"') $logHash[$key] = $value } # 哈希表直接转换为PSCustomObject [PSCustomObject]$logHash } # 如果只需要你指定的几个字段,可以单独筛选重命名 $filteredLogs = $logObjects | Select-Object srcip, dstip, srcport, dstport, @{Name='fw'; Expression={$_.devname}} # 输出前5条查看结果 $filteredLogs | Select-Object -First 5 | Format-Table
原代码问题说明
你之前编写的正则存在多处语法和逻辑错误:
- 错误添加转义符,比如
\devname的写法不符合正则规则 - 捕获组范围错误,把
srcip=这类字段前缀也包含到了要提取的取值范围内 - 额外添加了不存在的
:分隔符匹配规则,原日志字段之间是空格分隔
用上述通用方法可以适配所有同格式的飞塔日志,后续需要新增字段时直接在Select-Object中添加对应键名即可,无需修改正则规则。
内容的提问来源于stack exchange,提问作者Tobias Roth
相关产品推荐
相关产品推荐

