在 powershell 中搜索日志

searching a log in powershell

我正在尝试使用 powershell 在日志中搜索特定字符串 - 然后使用包含该字符串的行的特定部分。

我感兴趣的日志行如下所示:

2019-02-25 11:51:37.394 field1=data|field2=data|field3=data|field4=data|field5=data

我可以很好地获取这些行的 returns - 但我需要从其中一个字段中提取数据以用于另一次搜索。我被困在那里了。我如何从特定的 "field" 中提取数据(字段由 | 分隔,数据与字段名由 = 分隔)?

$dir = "path\to\workingdir"
$file = "logfilename"
$str2 = "eventType=59"

$out = (Get-Content $dir$file | Select-String -Pattern $str2 |out-string)

我需要提取并使用字段 3 中的数据来再次搜索日志。我尝试过的任何东西似乎 return 我在 $out 中得到的一切。我似乎无法让 "split" 或 "indexof" 正常工作(根本)......虽然我什至不确定这是否是我应该尝试使用的。

一旦你有了包含字段的字符串,你就可以使用 .Split() 方法来抓取项目。像这样的……

'field1=data1|field2=data2|field3=data3|field4=data4|field5=data5'.Split('|')[2].Split('=')[1]

...会给你这个...

data3

首先,您需要将日志消息与时间戳分开:

$line = '2019-02-25 11:51:37.394 field1=data|field2=data|field3=data|...'
$date, $time, $msg = $line.Split(' ', 3)

例如像这样,当您处理日志文件时:

Get-Content "${dir}${file}" | ForEach-Object {
    $date, $time, $msg = $_.Split(' ', 3)
    # ...
}

在没有时间戳的情况下,您可以通过在分隔符处拆分来仅处理消息:

$msg.Split('|') | ForEach-Object {
    $name, $value = $_.Split('=', 2)
}

根据您的实际用例,您可以使用上述方法将日志消息转换为哈希表

$data = @{}
$msg.Split('|') | ForEach-Object {
    $name, $value = $_.Split('=', 2)
    $data[$name] = $value
}

然后使用该哈希表进行进一步处理,例如

if ($data['eventType'] -eq '59') {
    # do some
} else {
    # do other
}