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 行,否则仅输出当前行的主要内容,如果未能解决你的问题,请参考以下文章

如何通过powershell将每一行文本文件保存为数组

从 MATLAB 调用 Powershell 不会移动到 MATLAB 中的下一行

PowerShell 变量包含特定数字

使用 Powershell 从文件中删除最后一行

写一个函数,输人一行字符,将此字符串中最长的单词输出

写一个函数,输人一行字符,将此字符串中最长的单词输出