我正在尝试创建PowerShell脚本以从大型日志文件中选择特定行。使用Select-String
,我已经将数据简化为多行字符串中所需的行。现在我想进一步按摩它,只返回这些行中的ID号,用一个逗号分隔的字符串。
当前代码:
if (Select-String $SearchFile -Pattern $SearchString -Quiet) {
Write-Host "Error message found"
$body += Select-String $SearchFile -Pattern $SearchString -Context 1,0 |
foreach {$_.Context.DisplayPreContext} | Out-String
Send-MailMessage (email_info_here) -Body $body
} else {
Write-Host "No errors found"
}
目前返回以下字符串:
INFO | Creating Batch for 197988 | 03/24/2016 02:10 AM INFO | Creating Batch for 202414 | 03/24/2016 02:10 AM INFO | Creating Batch for 173447 | 03/24/2016 02:10 AM
想要将输出格式化为:
197988, 202414, 173447
答案 0 :(得分:2)
如果Body包含这些行,那么您只需要拆分并索引到包含我们数据的列。
$body | ForEach-Object {$psitem.Split()[5]}
197988
202414
173447
在这个示例中,我们调用ForEach-Object在每一行上执行一个小代码块。然后,我们调用行的$split()
方法来分隔空格。然后我们使用$psitem[5]
索引到第五列。
假设您想要将行重新保存回$body
,只需将$body =
添加到第1行的前面。
在原始帖子中, $ body 变量是使用Out-String
创建的,作为管道中的最后一个命令。这将使它成为单个多行字符串。省略| Out-String
部分会使 $ body 成为一个字符串数组。后者(数组)更容易使用,并且是上面的答案所假设的,因为使用foreach
很容易遍历数组中的每一行。
两者之间的转换是这样完成的:
$string = @"
INFO | Creating Batch for 197988 | 03/24/2016 02:10 AM
INFO | Creating Batch for 202414 | 03/24/2016 02:10 AM
INFO | Creating Batch for 173447 | 03/24/2016 02:10 AM
"@
$array = @(
"INFO | Creating Batch for 197988 | 03/24/2016 02:10 AM"
"INFO | Creating Batch for 202414 | 03/24/2016 02:10 AM"
"INFO | Creating Batch for 173447 | 03/24/2016 02:10 AM"
)
$array_from_string = $string -split("`n")
$string_from_array = $array | Out-String
为了使答案顺利进行,您需要确保 $ body 是一个数组,否则您将只获得一个ID号:
$string | Foreach-Object {$psitem.Split()[5]}
197988
答案 1 :(得分:1)
将Out-String
替换为与每个结果行的数字部分匹配的Where-Object
过滤器,提取数字子匹配,然后加入结果:
$body += (Select-String $SearchFile -Pattern $SearchString -Context 1,0 |
ForEach-Object { $_.Context.DisplayPreContext } |
Where-Object { $_ -match 'for (\d+) \|' } |
ForEach-Object { $matches[1] }) -join ', '
答案 2 :(得分:0)
这可能是一种肮脏的方式,但它有效:
#This can also be your variable
$log = gc "C:\[log path here]"
#Remove beginning of string up to ID
$log = $log -replace '(.*?)for ' , ""
#Select first 6 characters since all IDs shown are 6 characters
$logIDs = @()
foreach($line in $log){
$logIDs += $line.substring(0,6)
}
### At this point $logIDs contains all IDs, now we just need to comma separate them ###
$count = 1
foreach($ID in $logIDs){
if($count -eq $logIDs.count){
$result += $ID
}
else{
$result += $ID+", "
$count++
}
}
#Here are your results separated by commas
$result
希望这有帮助,如果您需要任何类型的变体,请告诉我。