如何用awk筛选包含指定CRITERIA的PATTERN1与PATTERN2间文本块?
使用AWK筛选指定模式间包含关键词的文本块
我来帮你搞定这个需求!用AWK完全可以实现,而且逻辑清晰、灵活度高。下面直接上可运行的解决方案,再给你拆解细节:
核心AWK脚本
awk -v pattern1="start" -v pattern2="end" -v criteria="DCE" ' # 匹配到起始模式时,标记进入块并初始化存储变量 $0 ~ pattern1 { in_block = 1 block = "" } # 处于块内时,持续累加内容(保留换行符) in_block { block = block $0 ORS } # 匹配到结束模式时,检查块内是否包含关键词,符合条件则输出 $0 ~ pattern2 { in_block = 0 if (block ~ criteria) { printf "%s", block } } ' input.txt
脚本说明
- 变量传递:用
-v参数把起始模式、结束模式和筛选关键词作为变量传入,不用硬编码到脚本里,后续修改参数非常方便。 - 块状态管理:用
in_block标记是否处于两个模式之间的文本块内,确保只处理目标区间的内容。 - 块内容存储:用
block变量累加整个块的内容(包括换行符ORS,保证输出格式和原文本一致)。 - 筛选逻辑:遇到结束模式时,检查存储的块内容是否包含指定关键词,只有符合条件的块才会被输出。
示例验证
用你提供的输入文本测试:
start 123 ABC 123 end start 123 DCE 123 end start 123 EFG 123 end
运行脚本后,输出结果正好是你需要的:
start 123 DCE 123 end
额外注意事项
- 如果你的
pattern1、pattern2或criteria包含正则特殊字符(比如.、*、?),想要精确匹配而非正则匹配的话,可以用GNU AWK的\Q...\E语法转义,把判断条件改成block ~ "\\Q" criteria "\\E"即可。 - 这个脚本支持多行文本块,即使起始和结束模式不在同一行,也能正确捕获整个块并筛选。
内容的提问来源于stack exchange,提问作者Code_So1dier
相关产品推荐
相关产品推荐

