在 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
}
我正在尝试使用 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
}