【问题标题】:How can i grep the last group of lines using awk?我如何使用 awk grep 最后一组行?
【发布时间】:2021-01-16 05:51:52
【问题描述】:

我的文件file.txt中有以下内容

Start
1
2
3
5
end
Start
a
b
c
d
end

我如何只使用 awk 来获取从“开始”到“结束”末尾的部分,如下所示?

Start
a
b
c
d
end

尝试过:

awk '/Start/ {{ f = 1;n++ }} f && n == 2; /end/ {{ f = 0 }}' file.txt

【问题讨论】:

  • 如果您已经知道如何获得第一个匹配项,这里有一个获得最后一个匹配项的提示:使用tac 逐行反转输入文件,调整您的代码以获得第一个匹配项,然后使用tac再次
  • 我尝试了以下命令 awk '/Start/ {{ f = 1;n++ }} f && n == 2; /end/ {{ f = 0 }}' 文件.txt
  • 但我不想给出任何数字“2”,因为我可能不知道发生了多少次。
  • @Sandeep,感谢您发布您的努力,请在您的问题中添加它们,因为 cmets 不是为了展示努力,继续加油,干杯。
  • 如果在输入的最后一个end 行之后有一个start 行怎么办?应该打印从最后一个start 到文件结尾的文本,还是打印倒数第二个start 和最后一个end 之间的文本块?

标签: awk grep tac


【解决方案1】:

使用tac + awk 解决方案,请您尝试关注。

tac Input_file | awk '/^end/{found=1} found; /^Start/{exit}' | tac

解释: tac 会以相反的顺序(从下到上)打印 Input_file,然后将其输出传递给awk 命令和awkend 的第一次出现到start 的第一次出现之前的代码打印。当找到第一次出现start 时退出awk 代码,再次将此输出发送到tac,这将反转输出并以原始形式的Input_file 发布。


第二个解决方案: 使用 GNU awk 可以尝试类似,但它假定没有差异(意味着每次开始后 OP 的 Input_file 中都有 end 关键字否则它会在开始和结束关键字出现时给出误报结果。

awk -v RS= '{sub(/.*Start/,"Start")} 1' Input_file

【讨论】:

    【解决方案2】:

    你可以使用这个awk:

    awk '$1 == "Start" { s = ""; p = 1 }
    p { s = s $0 ORS }
    $1 == "end" { p = 0 }
    END { printf "%s", s }' file
    
    Start
    a
    b
    c
    d
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 2018-10-10
      • 2021-05-15
      相关资源
      最近更新 更多