sed 脚本在最后一次出现匹配后打印 n 行

asu*_*sub -1 sed text-processing

是一个链接,用于打印最后一次匹配项之后的所有行。

但是,我只想在最后一次出现匹配后打印两行。我该怎么做?

Jef*_*ler 5

你可以使用ed

printf '%s\n' '?pattern?+1, ?pattern?+2 p' | ed -s file
Run Code Online (Sandbox Code Playgroud)

这会向ed标准输入发送一个命令;该-s标志禁止在读取文件时将字节计数作为输出。该命令分解如下:

  • ... , ... p -- 打印给定 (... , ...) 地址范围内的行
  • ?pattern?+1-- 向后搜索pattern然后添加一个
  • ?pattern?+2-- 向后搜索pattern然后添加两个

当前默认为文件的最后一行,因此这些搜索查找pattern文件中最后出现的。然后偏移选择后面的两条线。


ter*_*don 5

使用GNUgreptail?的???的示例文件

$ cat file
====
1
2
3
4
====
11
22
33
====
111
222
333
444
====
1111
2222
3333

$ grep  -A2 "====" file  | tail -n2
1111
2222
Run Code Online (Sandbox Code Playgroud)

-A2通知grep打印匹配的行(在这种情况下,我们正在寻找====)和之后的两行。然后,tail -n2只打印最后两行。

如果您的文件非常大,您可以通过从文件末尾读取tac并反转逻辑来加快速度:

$ tac file | grep -m1 -B2 "====" | tac |tail -n2
1111
2222
Run Code Online (Sandbox Code Playgroud)