微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我的文件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 '$1 == "Start" { s = ""; p = 1 }
p { s = s $0 ORS }
$1 == "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。找到第一个awk时从start代码退出,此输出再次发送到tac,它将反转输出并将其以Input_file的原始形式发布。


第二个解决方案: 使用GNU awk可以尝试,但它假定没有差异(表示每次开始后在其中存在end关键字) OP的Input_file,否则将在开始和结束关键字的外观中给出错误的肯定结果。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。