PowerShell 如果下一行包含“此字符串”,则输出当前行和下 3 行,否则仅输出当前行
Posted
技术标签:
【中文标题】PowerShell 如果下一行包含“此字符串”,则输出当前行和下 3 行,否则仅输出当前行【英文标题】:PowerShell if next line contains "this string" ,output current line and next 3 lines else output just current line 【发布时间】:2020-03-04 06:30:54 【问题描述】:(抱歉英语不好)我需要一个 PowerShell 脚本,如果下一行包含“此字符串”,则输出当前行,否则接下来的 3 行仅输出当前行。 例如
错误 信息 错误 错误 例外 错误
如果下一行没有'exeption'字符串,只输出一个excel文件错误,但是如果错误字符串的下一行包含exeption,返回错误行+下3行
【问题讨论】:
请显示您的代码进度。 我是初学者,正在寻找解决方案。 首先您必须尝试执行此操作,然后显示您的代码,然后寻求帮助。如果你展示你的字符串的例子,你如何阅读它,以及来自你的文件的数据,那就太好了 @Vad 我正在使用这个命令 Get-Content input.log | Select-String -Pattern "ERROR" -Context 2,4 但它只输出 ERROR 字符串以及后续行。从逻辑上讲,如果此“错误”的下一行有“异常”,则输出错误+下 3 行。像这样。========================= 错误(ProductStructuresGenerator.java:69)报告:rowMode com.enterprisedt.net.ftp.FTPException:= ====== 【参考方案1】:你搜索了什么?
整个网络上都有很多这个用例的示例,就在 SO 上。 这里的人们很乐意提供帮助,但您必须展示努力、代码和错误。
我通常不会为这些类型的帖子这样做,但让我开始吧。因此,下次您访问时,您更愿意帮助人们,帮助您。
只需搜索...
'PowerShell select string and next 3 lines'
...并且始终阅读帮助文件,不要猜测或假设,在这种情况下,Get-Content 或选择字符串 cmdlet
# Help topics
Get-Help about_*
# get function / cmdlet details
Get-help -Name Get-Content -Full
Get-help -Name Select-String -Full
... 和 查看 -Context 开关 信息和示例。以及有关条件逻辑的帮助文件,即 if/then。
PowerShell: Select line preceding a match — Select-String -Context issue when using input string variable
Reading text file with -context
阅读讨论并查看给出的答案。
所以,您的问题几乎可以被认为是上述 SO 线程的重复,尽管它是反向的,这意味着您只需要切换方向,如第二个示例。
更新
好的,因为您刚刚发布了一些代码(尽管总是用代码更新您的问题,而不是将其放在评论部分,以便更容易理解并让人们了解),表明您正在走下坡路正确的轨道,它真的像这样简单:
# Example
@'
line1
line2
line3
line4
line5
'@ | Out-File -FilePath 'D:\temp\FileWithLines.txt'
Get-Content -Path 'D:\temp\FileWithLines.txt' |
Select-String -Pattern line2 -Context 0,3
<#
# Results
> line2
line3
line4
line5
#>
Get-Content -Path 'D:\temp\FileWithLines.txt' |
Select-String -Pattern line1 -Context 0,3
<#
# Results
> line1
line2
line3
line4
#>
If (Get-Content -Path 'D:\temp\FileWithLines.txt' | Select-String -Pattern line0)
Get-Content -Path 'D:\temp\FileWithLines.txt' |
Select-String -Pattern line1 -Context 0,3
Else
Write-Warning -Message "Current line is
$(Get-Content -Path 'D:\temp\FileWithLines.txt' |
Select-String -Pattern line1)"
<#
# Results
WARNING: Current line is
line1
#>
【讨论】:
不用担心。这里有一群非常乐于助人的人,但他们真的不喜欢让其他人从头开始为他们工作。您会定期收到诸如 SO 不是免费的代码/脚本编写服务之类的声明,然后他们将发送到“如何提出问题主题”。然而,每隔一段时间,如果他们感兴趣的话,我就会跳入一些东西。【参考方案2】:试试这样:
# get file content as an array
$lines = Get-Content "filepath"
$line = 0
# read lines one by one
$lines | foreach
# increment line counter
$line++
if ($_ -match ".*(This string).*")
# Line matched show current line and next 3 lines from $lines array
$_
$lines[$line..($line+3)]
【讨论】:
以上是关于PowerShell 如果下一行包含“此字符串”,则输出当前行和下 3 行,否则仅输出当前行的主要内容,如果未能解决你的问题,请参考以下文章