提取日志文件的特定部分

时间:2015-03-10 18:04:53

标签: regex powershell

我有一个程序,每晚运行几个实用程序。此实用程序每晚输出对同一日志文件执行的每个操作。日志是累积的,所以我有数千行要排序。这是一个示例:

2014/10/15 08:19:43 [夜间运行]开始了。
10/15/2014 08:19:44在2014年10月15日上午8:19开始标题检查
10/15/2014 08:19:44无法读取标题 - [Filepath]
10/15/2014 08:19:46 2014年10月15日上午8:19结束标题检查
10/15/2014 08:19:47 [效用1]开始了 10/15/2014 08:20:14 [效用1]结束了 10/15/2014 08:20:18 [效用2]开始了。
10/15/2014 08:20:18 [效用2]结束了。
10/15/2014 08:20:33 [夜间运行]结束。

标头检查每晚进行,因此有数百条线路要经过。 "无法读取标题"每晚都不会发生错误。我试图将标题错误的夜晚输出到文本文件,基本上我希望我的输出读取为

2014/10/15 08:19:44 2014年10月15日上午8:19开始标题检查
10/15/2014 08:19:44无法读取标题 - [Filepath]
10/15/2014 08:19:46 2014年10月15日上午8:19结束标题检查

每次标题检查在特定[文件路径]上运行AND错误。

我的想法是根据" Start Header Check" /" End Header Check"将文本分成单独的对象。并使用select-string只捕获包含"无法读取标题的对象 - [Filepath]"。

    Get-content X:\logfile.txt -delimiter "Start Header Check" |
    Select-String -Pattern 'Unable to read header - [Filepath]' |
    out-file X:\outfile.txt

返回:

2014年10月15日上午8:19
10/15/2014 08:19:44无法读取标题 - [Filepath]
10/15/2014 08:19:46 2014年10月15日上午8:19结束标题检查
10/15/2014 08:19:47 [效用1]开始了 10/15/2014 08:20:14 [效用1]结束了 10/15/2014 08:20:18 [效用2]开始了。
10/15/2014 08:20:18 [效用2]结束了。
10/15/2014 08:20:33 [夜间运行]结束。

它削减了我不想要的大部分运行但我还有很多我不需要的额外信息。我可以看出为什么它会返回这个但我无法找到解决方法。我认为正则表达式必须以某种方式参与,但我多年没有使用正则表达式。

我确实考虑过使用-raw开关作为-raw参数并使用.slipt(),但我很确定我正在用错误的树吠起来。

我陷入困境,整个上午都在尝试不同的调整,但我还没有取得进展。我会列出我尝试过的所有内容,但我不想让这些水变得混乱。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我首先使用Get-Content -Delimiter '[Nightly Run]结束。

这会将它分解为每次运行的行组。每个组都是一个单行多行字符串。使用多行正则表达式从每个组中提取相关行:

$regex = 
@'
(?ms)[0-9/]+ [0-9:]+ Start Header Check at .+? 
.+? Unable to read header .+
.+? End Header Check .+? on [0-9/]+
'@

Get-content X:\logfile.txt -delimiter '[Nightly Run] ended.' |
foreach {
 if ($_ -match $regex)
  { $Matches[0] }
 }

编辑:正则表达式调整了多次读取失败的可能性。