从多行字符串中选择多个子字符串



我正试图创建一个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"
}

当前返回以下字符串:

信息|为197988创建批次|03/24/2016 02:10 AM信息|正在为202414创建批次|03/24/2016 02:10 AM信息|正在为173447创建批|03/24/2016 02:10 AM

希望将输出格式设置为:

197988202414173447

如果Body包含这些行,那么您只需要拆分并索引到包含数据的列中。

$body | ForEach-Object {$psitem.Split()[5]}
197988
202414
173447  

在这个示例中,我们调用ForEach对象来生成一个小代码块,以便在每行上执行。然后,我们调用行的$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

用与每个结果行的数字部分匹配的Where-Object过滤器替换Out-String,提取数字子匹配,并连接结果:

$body += (Select-String $SearchFile -Pattern $SearchString -Context 1,0 |
         ForEach-Object { $_.Context.DisplayPreContext } |
         Where-Object { $_ -match 'for (d+) |' } |
         ForEach-Object { $matches[1] }) -join ', '

这可能是一种肮脏的方法,但它很有效:

#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

希望这有帮助,如果你需要任何类型的变化,请告诉我。

相关内容

  • 没有找到相关文章

最新更新