我如何使用 awk grep 最后一组行?

How can i grep the last group of lines using awk?

我的文件中有以下内容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

您可以使用这个 awk:

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

有了tac + awk的解决方案,请你试试下面的方法。

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

解释: tac 将以相反的顺序(从下到上的方式)打印 Input_file,然后将其输出传递给 awk 命令,并在 awk 中从第一次出现 end 到第一次出现 start 进行代码打印。当发现第一次出现 start 时退出 awk 代码,再次将此输出发送到 tac,这将反转输出和 post 它的原始形式 Input_file.


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

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