在Powershell中搜索日志

时间:2019-02-25 17:43:13

标签: powershell split indexof select-string

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

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

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

我可以得到这些行的返回结果-但是我需要从那些字段之一中提取数据以用于另一次搜索。我被困在那里。

如何从特定的“字段”(由|分隔的字段和由fieldname与=分隔的数据)中提取数据?

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

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

我需要提取并使用字段3中的数据进行日志的另一次搜索。我尝试过的一切似乎都将返回我在$ out中获得的所有内容。我似乎无法(完全)正常使用“ split”或“ indexof”。...尽管我什至不确定那是否是我应该尝试使用的。

2 个答案:

答案 0 :(得分:0)

一旦其中包含带有字段的字符串,就可以使用.Split()方法来获取项目。像这样的东西

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

...会给你这个...

data3

答案 1 :(得分:0)

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

strtok( str, "( )" )

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

$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
}