Shell逐块匹配start-end区间关键词 未匹配输出none的实现方法
原命令失效原因
你之前写的命令存在两个核心问题:
- 逻辑错误:
awk '/start/,/end/'会提取所有start到end的块内容,但后续管道给egrep是在所有块的合并内容里全局搜索item#3,只要整个文件存在一个匹配项,egrep就会返回执行成功,不会触发后面的|| echo "none"逻辑,完全无法实现逐块判断的需求。 - 语法错误:输入文件
test.txt被错误写在了echo "none"的参数位置,没有作为前面awk命令的输入,awk实际会等待标准输入,正常运行时会直接卡住。
正确实现方案
直接使用awk单命令处理即可,不需要拼接多个管道工具,逻辑清晰且执行效率高:
awk ' /start/ { match_flag = 0; next } # 遇到块起始标记,重置匹配标记为未找到 /end/ { print match_flag ? "item#3" : "none"; next } # 遇到块结束标记,输出当前块的判断结果 /item#3/ { match_flag = 1 } # 块内匹配到关键词时,把标记设为已找到 ' test.txt
执行结果验证
针对你提供的test.txt测试文件,执行上述命令会输出完全符合预期的结果:
none item#3 none
内容的提问来源于stack exchange,提问作者pawana
相关产品推荐
相关产品推荐

