【问题标题】:Parsing to simulate "grep -C 2" in PowerShell version 1.0在 PowerShell 1.0 版中解析以模拟“grep -C 2”
【发布时间】:2010-10-05 18:39:34
【问题描述】:

我正在尝试挖掘一些日志并需要在我可以匹配的行之前和之后的信息。我将如何在 PowerShell ala "grep -C 2" 中执行此操作?

在版本 1 中,我等不及 r2​​,然后我可以将它放在生产机器上 :)

【问题讨论】:

标签: powershell scripting


【解决方案1】:

唉,看来您必须自己构建它或等待下一个版本的 powershell,如 it seems to have been implemented there。您可以从here 下载 Powershell 2.0 的预发布版本。

【讨论】:

    【解决方案2】:

    grep 的 PowerShell 等效项是 select-string。您可以使用以下内容。

    cat file | select-string "pattern" -context 2
    

    注意:这仅适用于 PowerShell v2.0。

    【讨论】:

    • v2 :@。我迫不及待地想把它放到生产服务器上。
    【解决方案3】:

    在这里越来越近-因为 Select-String 返回 MatchInfo 对象,我可以从 (39017) 中拉出行号,现在我只需要拉出周围的线...所以:

    gc $bigfile | Select-String melissao | 
    %{(gc $bigfile)[($_.LineNumber -2)..($_.LineNumber +2)]}
    

    如果有人可以稍微清理一下以使其不那么慢,那么您可能会有答案。否则,此解决方案会起作用,但显然不会很快。

    【讨论】:

      【解决方案4】:

      为 Windows 下载 grep,并从 PowerShell 调用 grep?

      【讨论】:

        【解决方案5】:

        不要再次使用 (gc $bigfile),这将导致 PowerShell 将 $bigfile 读入通过 ForEach-Object cmdlet 传递给它的每个对象的内存中,您可能应该将文件读入变量然后数组索引从那,像这样:

        $bigfile = gc 'c:\scripts\bigfile.txt'
        $bigfile | Select-String "melissao" | % {$bigfile[($_.LineNumber -3)..($_.LineNumber +1)]}
        

        此外,由于行号从 1 开始,数组索引从 0 开始,您必须向后退 3,而不是 2,才能使行在“melissao”上方两个空格,然后前进 1,而不是 2 , 得到“melissao”下面两个空格的行。这样做会让你得到你想要的 5 行,“melissao”两侧是它上面和下面的两条线。

        我对 grep -C 2 不是很熟悉,所以我不知道这是否完全复制了该功能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-08
          • 2016-12-30
          • 1970-01-01
          • 1970-01-01
          • 2012-07-24
          • 2016-05-12
          相关资源
          最近更新 更多