在powershell中搜索日志

问题描述 投票:0回答:2

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

我感兴趣的日志行看起来像这样:

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

我可以很好地获得这些行的返回 - 但我需要从其中一个字段中提取数据以用于另一个搜索。我被困在那里。我如何从特定的“字段”中提取数据(由|分隔的字段和从fieldname by =分离的数据)?

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

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

我需要提取并使用字段3中的数据进行另一次日志搜索。我尝试过的任何事情似乎都会让我得到的所有东西都归来了。我似乎无法让“分裂”或“索引”正常工作(根本)....虽然我甚至不确定这是否应该尝试使用。

powershell split indexof select-string
2个回答
0
投票

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

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

......会给你这个......

data3

0
投票

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

$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
}
© www.soinside.com 2019 - 2024. All rights reserved.