使用 awk 从一个匹配到另一个单独匹配的实例打印行

rav*_*aka 4 awk text-processing

我有一个要求。假设我的文件内容是

a
b
c
d
e
f
d
e
f
Run Code Online (Sandbox Code Playgroud)

我想打印从b到第二次重复的行d。是否有任何命令使用 awk 来执行此操作?

输出应该是

b
c
d
e
f
d
Run Code Online (Sandbox Code Playgroud)

如果是第一次b,我知道命令

awk '/b/,/d/' file.txt
Run Code Online (Sandbox Code Playgroud)

但是如果第二次重复,我想将文本打印到匹配点。我想在一行中包含命令。

Sun*_*eep 7

一种方法是使用标志和计数器来跟踪

$ awk '/b/{f=1; c=0} f; /d/ && ++c==2{f=0}' file.txt
b
c
d
e
f
d
Run Code Online (Sandbox Code Playgroud)
  • /b/{f=1; c=0} 设置开始匹配和初始化计数器的标志
  • f; 设置 long 标志时打印输入记录
  • /d/ && ++c==2{f=0} 如果第二次匹配结束字符串,则清除标志
  • awk '/b/{f=1} f; /d/ && ++c==2{exit}'如果只有一组要提取,可以简化为


请注意,如果结束匹配没有 2 个匹配项,它将打印到输入结束

$ seq 10 | awk '/4/{f=1; c=0} f; /6/ && ++c==2{f=0}'
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)