我正在尝试使用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中的数据进行另一次日志搜索。我尝试过的任何事情似乎都会让我得到的所有东西都归来了。我似乎无法让“分裂”或“索引”正常工作(根本)....虽然我甚至不确定这是否应该尝试使用。
一旦你有了包含字段的字符串,就可以使用.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
}