【问题标题】:Grep last match until the endGrep 最后一场比赛直到结束
【发布时间】:2021-08-24 23:21:17
【问题描述】:

我浏览了 StackExchange 网站,但没有找到任何我想要的东西。以下是 grep 的两个用例:

  • 在比赛之前/之后打印项目
  • 打印某个匹配项

我正在尝试解析一个日志文件,并且我想返回日志中的最后一个错误,可以预见的是,该错误位于文件的末尾。但是,有时错误是多行。 “如何 grep 最后一场比赛”的答案都涉及尾部或头部,并且只适用于单行。

就我而言,我只想返回文件中的所有内容,从最后一个匹配项开始。通常,这最多不会超过 10-15 行,所以 grep -A 15 可以解决问题。但是,我仍然只需要获取其中的最后一个,因此仅此一项并不能产生正确的输出。

天真的方法是使用两部分匹配,首先获取最后一个匹配是什么,然后是之后的所有内容。这对我不起作用,因为我不能保证最后一场比赛是唯一的。

是否有可能用 grep 以某种方式做到这一点,或者有更好的工具吗?

【问题讨论】:

    标签: grep string-matching


    【解决方案1】:

    有一种方法可以让sed 做到这一点,但我不记得了。

    如果您愿意在此处使用命令组合,则可能会起作用:

    # Get the line number of teh last match
    
    LNO=$( grep -n 'the error' the_file | tail -1 | cut -d":" -f1 )
    
    # Now use sed to print all lines from that point:
    
    sed -n "$LNO,\$p" the_file
    

    【讨论】:

    • 有效,只需要从A部分修剪新行
    【解决方案2】:

    我认为某处有完全相同的副本,但我只找到了这些相近的:

    这是一种方法:

    $ cat ip.txt
    foo123
    error 1
    xyz
    error 2
    99999
    88888
    
    $ tac ip.txt | sed '/error/q' | tac
    error 2
    99999
    88888
    

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 2016-06-05
      • 2013-09-17
      • 2014-01-01
      • 1970-01-01
      • 2022-11-23
      • 2014-08-16
      • 2013-07-25
      • 1970-01-01
      相关资源
      最近更新 更多