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

求助:使用PowerShell正则提取日志数据并生成指定格式CSV文件

日志字段提取与CSV生成问题解决

需求概述

从指定日志文件中提取日期、时间、应用名称、PID、主机名及消息内容,生成符合要求格式的CSV输出文件。

日志样本

[2022-05-31T16:56:25.551558-04:00] [XFM] [TRACE:1] [EPMHFM-00000] [XFM] [ecid: XDS.0000.0000.0000.0001] [File: c:\\jenkins\\workspace\\hfm_11.2.8_rue_build\\hfm\\source\\xfmdatasourceroot\\xfmdatasource\\xfmdatasource.cpp] [Line: 601] [userId: ] [Msg arguments: ] [appName: COMMAPS4] [pid: 8364] [tid: 14160] [host: win2019standard] [nwaddr: [fe80::3d7e:f4de:2f83:8e30%4]:0;10.65.51.209:0;] [errorCode: 0] [srcException: 0] [errType: 1] [dbUpdate: 2] [11.2.8.1.000.9]  [[XDS: XFMDataSource process starting...
 
[2022-08-28T20:04:39.037507-04:00] [XFM] [TRACE:1] [EPMHFM-00000] [XFM] [ecid: ] [File: c:\\jenkins\\workspace\\hfm_11.2.6_build\\hfm\\source\\xfmdatasourceroot\\xfmdatasource\\xfmdatasource.cpp] [Line: 489] [userId: ] [Msg arguments: ] [appName: COMMAPS4] [pid: 11496] [tid: 9268] [host: Win2019standard] [nwaddr: [fe80::dca:9652:390a:7031%11]:0;10.199.36.35:0;] [errorCode: 0] [srcException: 0] [errType: 1] [dbUpdate: 2] [11.2.6.0.000.38]  [[XDS: XFMDataSource process exiting now ...

用户尝试的脚本及问题

提取字段的尝试脚本

Get-Content -Path "C:\\Users\\test.txt" | Select-String -pattern "(\d{4}\-\d{2}\-\d{2})|(\d\d:\d\d:\d\d)|host+:\s([a-zA-Z \d]+)|appName+:\s([a-zA-Z \d]+)|(11.\d.\d.\d.\d\d\d.\d\d)|pid+:\s([a-zA-Z \d]+)|XDS+:\s([a-zA-Z \d]+)" -AllMatches | ForEach-Object {$_.Matches.value} | ForEach-Object {$_.Groups[1].Value}

该脚本能零散提取出字段值,但无法按日志条目整合,输出结果如下:

2022-05-31

16:56:25

appName: COMMAPS4

pid: 8364

host: win2019standard

XDS: XFMDataSource process starting

导出CSV的尝试脚本

$content = Get-Content -Path "C:\\Users\\test.txt"
$regex = '(\d{4}\-\d{2}\-\d{2})|(\d\d:\d\d:\d\d|host+:\s([a-zA-Z \d]+))|appName+:\s([a-zA-Z \d]+)|(11.\d.\d.\d.\d\d\d.\d\d)|pid+:\s([a-zA-Z \d]+)|XDS+:\s([a-zA-Z \d]+)'
[regex]::Matches($content, $regex) | % {  
    [PSCustomObject]@{
            Date = $_.Groups.Value[1]
            Time = $_.Groups.Value[2]
             Server= $_.Groups.Value[3]
             Application= $_.Groups.Value[4]
             Version= $_.Groups.Value[5]
             PID= $_.Groups.Value[6]
             Message= $_.Groups.Value[7]
            }
 }  | Export-Csv -Path "C:\\Users\\test.csv"

此脚本存在两个核心问题:

  1. 正则分组逻辑错误,使用|分隔的分组会导致只有匹配到的组有值,无法同时提取所有字段
  2. 未按单条日志条目处理,导致生成的CSV每行仅包含单个字段,而非完整的日志记录

正确解决方案

实现脚本

# 定义日志文件路径和输出CSV路径
$logPath = "C:\Users\test.txt"
$csvPath = "C:\Users\test.csv"

# 匹配单条日志所有目标字段的正则表达式
$logRegex = '\[(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2}).*?\[appName:\s+([^\]]+)\].*?\[pid:\s+(\d+)\].*?\[host:\s+([^\]]+)\].*?\[\[XDS:\s+(.+?)(?=\.\.\.|$)'

# 按行读取日志,处理每条记录
Get-Content -Path $logPath | ForEach-Object {
    # 跳过空行
    if ([string]::IsNullOrWhiteSpace($_)) { return }
    
    # 匹配当前行的字段
    $match = [regex]::Match($_, $logRegex)
    if ($match.Success) {
        # 构建自定义对象,映射提取到的字段
        [PSCustomObject]@{
            Date     = $match.Groups[1].Value
            Time     = $match.Groups[2].Value
            Appname  = $match.Groups[3].Value
            PID      = $match.Groups[4].Value
            Host     = $match.Groups[5].Value
            Message  = $match.Groups[6].Value.TrimEnd('..')  # 移除结尾的省略号
        }
    }
} | Export-Csv -Path $csvPath -NoTypeInformation -Encoding UTF8

脚本说明

  1. 正则表达式解析:

    • \[(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2}):从日志开头的时间戳中分离提取日期和时间
    • .*?\[appName:\s+([^\]]+)\]:非贪婪匹配到appName字段的值(直到]结束)
    • .*?\[pid:\s+(\d+)\]:提取PID数值
    • .*?\[host:\s+([^\]]+)\]:提取主机名
    • .*?\[\[XDS:\s+(.+?)(?=\.\.\.|$):提取XDS消息内容,直到...或行尾停止
  2. 处理逻辑:

    • 按行读取日志,跳过空行
    • 对每行应用正则匹配,仅处理匹配成功的日志条目
    • 构建包含目标字段的自定义对象,统一格式后导出为CSV

生成的CSV示例

Date,Time,Appname,PID,Host,Message
2022-05-31,16:56:25,COMMAPS4,8364,win2019standard,XFMDataSource process starting
2022-08-28,20:04:39,COMMAPS4,11496,Win2019standard,XFMDataSource process exiting now

内容的提问来源于stack exchange,提问作者ajay k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:10:20