asu*_*sub -1 sed text-processing
这是一个链接,用于打印最后一次匹配项之后的所有行。
但是,我只想在最后一次出现匹配后打印两行。我该怎么做?
你可以使用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
文件中最后出现的。然后偏移选择后面的两条线。
使用GNUgrep
和tail
和?的???的示例文件:
$ 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)