【发布时间】:2016-08-19 15:11:49
【问题描述】:
使用脚本从日志文件中提取数据;搜索查询中的术语和执行时间。
来自日志文件的样本
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 解码每一行并删除一个长的安全信息字符串
$VarURLDecoded = [System.Web.HttpUtility]::UrlDecode($line) -replace "SecurityInfo=.*"
现在我正在努力使用正则表达式来提取以下内容: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 语法,包括第二行上的持续时间记录。要么使用它遵循下面的行的事实,要么使用它具有适当时间戳的事实。
一旦我得到基本的正则表达式工作,我可以通过添加命名组并将结果导出到哈希表来增加复杂性。
【问题讨论】:
标签: regex powershell