如何使用 awk 打印出最后一个模式范围?

发布于 2024-10-07 20:55:46 字数 280 浏览 2 评论 0原文

我的文件是这样的:

/开始模式/
第一个匹配
/结束模式/

其他文字

/开始模式/
第二个匹配
/结束模式/

其他文字

/开始模式/
这是我的 想要打印
/end 图案/
其他文字

如何使用 awk 打印出最后一个匹配项?我只知道如何打印所有这些匹配项。

My file is like this:

/begin pattern/
first match
/end pattern/

other text

/begin pattern/
second match
/end pattern/

other text

/begin pattern/
This is the one I
want to print out
/end
pattern/
other text

How can I print out the last match using awk? I just know about how to print out all these matches.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

三人与歌 2024-10-14 20:55:46

取决于您是否想要打印包含分隔符的行:

$ awk '
    /begin pattern/ { rec=""; f=1 }
    f { rec=rec $0 ORS; if (/end pattern/) {last=rec; f=0} }
    END { printf "%s", last }
' file
/begin pattern/
This is the one I want to print out
/end pattern/

或者:

$ awk '
    f { if (/end pattern/) {last=rec; f=0} rec=rec $0 ORS }
    /begin pattern/ { rec=""; f=1 }
    END { printf "%s", last }
' file
This is the one I want to print out

这确保您打印的是一个以 begin pattern 开头并以 end pattern 结尾的块,这样您就可以如果输入文件末尾存在这样的内容,不要只打印没有结束模式开始模式之后的一堆行。如果输入中不存在匹配的块,它还可以确保您不会打印空行。

Depending on if you want the lines containing the delimiters printed or not:

$ awk '
    /begin pattern/ { rec=""; f=1 }
    f { rec=rec $0 ORS; if (/end pattern/) {last=rec; f=0} }
    END { printf "%s", last }
' file
/begin pattern/
This is the one I want to print out
/end pattern/

or:

$ awk '
    f { if (/end pattern/) {last=rec; f=0} rec=rec $0 ORS }
    /begin pattern/ { rec=""; f=1 }
    END { printf "%s", last }
' file
This is the one I want to print out

That ensures that what you print is a block starting with begin pattern and ending with end pattern so you don't just print a bunch of lines following a start pattern with no end pattern if such exists at the end of your input file. It also ensures you don't print a blank line if no matching block exists in the input.

梦幻之岛 2024-10-14 20:55:46
awk 'END { print r } 
/end pattern/ { f = x }
/begin pattern/ { f = 1; r = x }
f++ > 1 { r = r ? r RS $0 : $0 }
' infile 
awk 'END { print r } 
/end pattern/ { f = x }
/begin pattern/ { f = 1; r = x }
f++ > 1 { r = r ? r RS $0 : $0 }
' infile 
暮年慕年 2024-10-14 20:55:46

存储当前匹配并使用 END 块将其打印出来:

awk '/end pattern/{flag=0} flag{m=$0} /begin pattern/{flag =1}  END{print m}' file

如果 /begin pattern/ 和 /end pattern/ 之间只有一行,则此方法有效。

Store the current match and use the END block to print it out:

awk '/end pattern/{flag=0} flag{m=$0} /begin pattern/{flag =1}  END{print m}' file

This works if there is only one line between /begin pattern/ and /end pattern/.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文