我正在尝试使用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”。...尽管我什至不确定那是否是我应该尝试使用的。
答案 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
}