求编写Shell脚本:根据多条件筛选文件中List条目对应的Acronym字段
求编写Shell脚本:根据多条件筛选文件中List条目对应的Acronym字段
没问题,我来帮你搞定这个需求!针对你给出的这种分段结构化的文本,用awk来处理是最省心的,它能完美应对这种按条目分组的文本解析。
下面是符合你要求的脚本,直接就能用:
awk ' BEGIN { # 初始化变量,用来暂存当前条目的各个关键字段 acronym = "" is_default = "" state = "" instances = "" } # 当遇到List下的新条目时,先检查上一个条目是否符合条件 /^Name: / && in_list { # 三个条件同时满足时输出对应的Acronym if (is_default == "false" && state == "State[Inactive]" && instances == "0") { print acronym } # 重置变量,准备处理新条目 acronym = "" is_default = "" state = "" instances = "" } # 标记开始处理List下面的内容 /^List:/ { in_list = 1 next } # 在List范围内,提取各个需要的字段值 in_list { if (/^Acronym: /) { acronym = $2 } else if (/^Is Default: /) { is_default = $3 } else if (/^State: /) { state = $2 } else if (/^No of running instances: /) { instances = $5 } } # 处理文件最后一个条目,避免遗漏检查 END { if (is_default == "false" && state == "State[Inactive]" && instances == "0") { print acronym } } ' your_file.txt
脚本逻辑说明:
- 初始化变量:在脚本开始时,先定义几个变量用来暂存每个条目的Acronym、Is Default等值;
- 标记List区域:当读到
List:这一行时,开启List区域的处理开关; - 提取字段:在List区域内,分别捕获每个条目的Acronym、Is Default、State、运行实例数这几个关键值;
- 条件检查:每当遇到下一个条目的
Name:行时,就检查上一个条目的三个条件是否都满足,满足则输出Acronym; - 收尾处理:脚本结束前,再检查最后一个条目,避免因为文件末尾没有新的
Name:行而漏掉。
使用方法:
把脚本里的your_file.txt替换成你实际的文件名,直接在终端运行这个脚本,就能得到你想要的结果——比如你示例里的TEST11_1。
如果你的文本格式有细微调整(比如空格数量变化),这个脚本也能正常工作;要是你想更灵活地匹配State里的Inactive(比如不严格匹配整个State[Inactive]字符串),可以把条件改成state ~ /Inactive/就行。
备注:内容来源于stack exchange,提问作者Dave Dolone
相关产品推荐
相关产品推荐

