如何用grep精准筛选Test:: Member及其关联的Availability、State行?
精准提取目标条目下的指定行
用awk实现上下文匹配
grep没法处理上下文关联的匹配,换awk就能轻松搞定——它能追踪当前是否处于Test:: Member的条目范围内,只提取该范围内的目标行。
方案一:清晰逻辑版
直接在命令行运行:
awk '/^Test:: / { target = ($0 ~ /Test:: Member/) ? 1 : 0 } target == 1 && (/Availability/ || /State/) { print } /^Test:: Member/ { print }' your_data_file.txt
逻辑拆解
- 碰到以
Test::开头的行时,判断是不是Test:: Member:是就开标记target=1,不是就关标记target=0 - 标记开着的时候,只要行里有
Availability或State就输出 - 同时单独输出
Test:: Member本身的行
方案二:简化版
如果想少写点代码,用这个更紧凑的写法:
awk '/Test:: Member/ {flag=1; print; next} /Test:: / {flag=0} flag && (/Availability|State/) {print}' your_data_file.txt
逻辑拆解
- 匹配到
Test:: Member时,打开标记flag=1,输出该行,直接跳到下一行 - 碰到其他
Test::开头的行,立刻关闭标记 - 标记开着的时候,输出所有含
Availability或State的行
为啥你的grep命令不对
grep -iE '(Test:: Member|availability|State)'是全局匹配所有符合模式的行,根本不管这些Availability/State属于哪个Test::条目,自然会把其他Test开头条目下的行也捞出来。awk的标记机制就能精准锁定目标条目下的内容,不会乱匹配。
内容的提问来源于stack exchange,提问作者Talal Habeeb
相关产品推荐
相关产品推荐

