我正在尝试使用powershell搜索特定字符串的日志 - 然后使用具有该字符串的行的特定部分。
我感兴趣的日志行:
2019-02-25 11:51:37.394 field1 = data | field2 = data | field3 = data | field4 = data | field5 = data
我可以可以获得这些行的返回 - 但是我需要从其中一个字段中提取数据以用于另一个搜索。我被困在那里。如何从特定的"字段"中提取数据(|分离的字段以及从fieldname by =)的数据?
分开$dir = "pathtoworkingdir"
$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)
}
根据您的实际用例,您可以使用上面将日志消息转换为hashtable
$data = @{}
$msg.Split('|') | ForEach-Object {
$name, $value = $_.Split('=', 2)
$data[$name] = $value
}
然后将其用于进一步处理,例如
if ($data['eventType'] -eq '59') {
# do some
} else {
# do other
}