PowerShell解析日志文件并整理为列输出至CSV求助
非结构化IKE日志转结构化CSV解决方案
你的现有代码仅将日志每行直接导出为CSV的单个字段,未对日志的结构化信息做解析。要实现需求,需先按IKE Peer条目块分割日志,再逐一解析块内属性,最终生成结构化对象导出。
实现步骤
- 读取日志完整内容,按条目块分割(每个条目以数字开头,如
1 IKE Peer:...) - 遍历每个条目块,提取并解析其中所有属性键值对
- 将每个条目转换为PowerShell自定义对象
- 收集所有对象后导出为标准CSV
完整代码
# 读取日志文件完整内容 $logContent = Get-Content -Path "C:\Users\testuser\datatoparse.log" -Raw # 按IKE Peer条目分割日志(匹配数字开头的条目起始行) $logBlocks = $logContent -split '(?=\d+\s+IKE Peer:)' | Where-Object { $_ -match '\S' } # 初始化结果存储数组 $results = @() foreach ($block in $logBlocks) { # 有序哈希表存储当前条目的所有属性 $props = [ordered]@{} # 解析条目编号、PeerIP和Peer名称 if ($block -match '^(\d+)\s+IKE Peer:\s+([\d\.]+)\s+\(([^)]+)\)') { $props['EntryID'] = $matches[1] $props['PeerIP'] = $matches[2] $props['PeerName'] = $matches[3] } # 解析所有键值对格式的行(支持单行多键值,如Type : L2L Role : initiator) $keyValueLines = $block -split "`n" | Where-Object { $_ -match '^\s*(\w[\w\s]+)\s*:\s*(\S+)' } foreach ($line in $keyValueLines) { if ($line -match '^\s*(\w[\w\s]+)\s*:\s*(\S+)') { # 清理键名(移除空格,避免CSV列名含空格) $key = $matches[1].Trim() -replace '\s+', '' $value = $matches[2].Trim() $props[$key] = $value } } # 将属性转为自定义对象并加入结果数组 $results += [PSCustomObject]$props } # 导出为UTF8编码的CSV文件 $results | Export-Csv -Path "logfile.csv" -NoTypeInformation -Encoding UTF8 Pause
代码说明
- 使用
-Raw参数读取完整日志,便于按条目块分割 - 正则表达式
(?=\d+\s+IKE Peer:)实现正向预查分割,确保每个块是完整的IKE Peer条目 [ordered]@{}保证CSV列顺序与日志中属性出现顺序一致- 自动清理键名中的空格,避免CSV列名格式混乱
- 兼容单行包含多个键值对的日志格式
输出CSV示例
导出的CSV会包含以下结构化列:EntryID, PeerIP, PeerName, Type, Role, Rekey, State, Encrypt, Hash, Auth, Lifetime, LifetimeRemaining,每个IKE Peer对应一行数据。
内容的提问来源于stack exchange,提问作者Jamie Lovenduski
相关产品推荐
相关产品推荐

