Select-String 允许通过参数-Context 在匹配行之前或之后选择给定数量的行。 -Context 2,0 选择前面 2 行,-Context 0,2 选择后面 2 行,-Context 2,2 选择匹配之前的 2 行以及匹配之后的 2 行。
但是,您不会将匹配行和上下文行放在一个大块中,因此如果您希望将匹配行和上下文合并为一个字符串:
Select-String -Pattern 'Line1' -Context 0,2 | ForEach-Object {
$($_.Line; $_.Context.PostContext) | Out-String
}
正如@mklement0 在 cmets 中正确指出的那样,上述操作相对较慢,如果您只处理几个匹配项,这不是问题,但如果您需要处理数百或数千个匹配项,则会成为问题。为了提高性能,您可以将值合并到一个数组中并使用 -join 运算符:
Select-String -Pattern 'Line1' -Context 0,2 | ForEach-Object {
(,$_.Line + $_.Context.PostContext) -join [Environment]::NewLine
}
请注意,两个代码 sn-ps 不会产生完全相同的结果,因为Out-String 会在包括最后一行在内的每一行中附加一个换行符,而-join 只在之间放置换行符行(不是在最后一行的末尾)。但是,可以修改每个 sn-p 以产生与另一个相同的结果。修剪第一个示例中的字符串以删除尾随换行符,或将另一个换行符附加到第二个示例中的字符串。
如果您希望输出为单独的行,只需输出 Line 和 PostContext 属性,而不将它们合并为一个字符串:
Select-String -Pattern 'Line1' -Context 0,2 | ForEach-Object {
$_.Line
$_.Context.PostContext
}