繁体   English   中英

Powershell正则表达式从日志文件中提取数据

[英]Powershell regex to extract data from log file

使用脚本从日志文件中提取数据; 搜索查询中的字词和执行时间。

日志文件中的样本

19/08/2016 09:08:00 [100] ACTION%3DQuery%26MaxResults%3D9999%26abridged%3Dtrue%26abridgedmeta%3Ddatabase%26printfields%3DIM_DOCNUM,IM_VERSION%26combine%3Dfieldcheck%26databasematch%3DDATABASE_1,DATABASE-2%26Text%3D((pep21556)%3AIM_DOCNAME)%26fieldtext%3D(WILD%7BWORK%7D%3AIM_PRJ_SUBTYPE+AND+WILD%7BWEBDOC%7D%3AIM_CLASS)+AND+BIASDATE%7B1471612079e,2592000,20%7D%3Aautn_date+AND+BIASDATE%7B1471612079e,63072000,20%7D%3Aautn_date%26anyLanguage%3Dtrue%26TimeoutMS%3D60000
19/08/2016 09:08:00 [100] Request completed in 12 ms.
19/08/2016 09:08:28 [103] Request from 10.1.1.131

日志文件是URL编码的。

我的进行中脚本加载日志文件

foreach ($line in [System.IO.File]::ReadLines($filename)) 

然后URL解码每行并删除长的securityinfo字符串

$VarURLDecoded = [System.Web.HttpUtility]::UrlDecode($line) -replace "SecurityInfo=.*"

现在,我正与RegEx苦苦挣扎,以提取以下内容:Date + Time,MaxResault = xxxxxxx,Text =((??????????):???????)和以毫秒为单位的时间在下一行中完成请求。

$findText = $VarURLDecoded | select-string -Inputobject {$_} -pattern 

我有一些正则表达式部分。

'(\d{2}/\d{2}/\d{4} \d{2}:\d{2}:\d{2})'  will find 19/08/2016 09:08:00
'MaxResults=(\d*)' will find MaxResults=9999
'(?<Text>&Text=\(\([^()]*\)\:[^()]*\))' will find &Text=((campeau):IM_DOCNAME)
'(\d* ms)' will find the xx ms

但是无法弄清楚AND语法是否将它们连接在一起,包括第二行上的持续时间记录。 要么使用它遵循的事实,要么使用它具有适当的时间戳记。

一旦基本正则表达式正常工作,我就可以通过添加命名组并将结果导出到哈希表来增加复杂性。

从发布的日志来看,由于没有%xx编码的字符,因此无需对其进行解码。
对于文本处理,不需要诸如[System.IO.File]类的低级内容。
需要附加一行,因此让我们-context before, after参数-context before, after使用-context before, after

$report = select-string -path $filename -context 0,1 -pattern (
    '^(?<date>.+?) ' +
    '(?<time>.+?) .+?' +
    '&MaxResults=(?<results>\d+).+?' +
    '&Text=(?<text>[^&]+)') |
%{
    $nextLine = $_.Context.PostContext[0]
    $g = $_.matches[0].groups
    @{
        date = $g['date'].value
        time = $g['time'].value
        results = $g['results'].value
        text = $g['text'].value
        duration = if ($nextLine -match 'completed in (\d+) ms') { $matches[1] }
    }
}

$report现在是一个对象数组,每个对象如下:

 Name Value ---- ----- date 19/08/2016 time 09:08:00 duration 12 results 9999 text ((pep21556):IM_DOCNAME) 

另外,考虑到选择字符串的模式匹配对于复杂的模式可能会比较慢,让我们使用简单的字符串进行匹配,用?过滤 Where-Object别名),然后处理结果:

$report = select-string -path $filename -context 0,1 -pattern '&MaxResults=' -simpleMatch |
?{ $_.Line -match (
    '^(?<date>.+?) ' +
    '(?<time>.+?) .+?' +
    '&MaxResults=(?<results>\d+).+?' +
    '&Text=(?<text>[^&]+)')
} | %{
    $nextLine = $_.Context.PostContext[0]
    $m = $matches # $matches is set by the above -match
    @{
        date = $m['date']
        time = $m['time']
        results = $m['results']
        text = $m['text']
        duration = if ($nextLine -match 'completed in (\d+) ms') { $matches[1] }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM