如何在Bash中提取紧跟kafka行的主机名?现有方法是否可行?
问题描述
给定一段CLI输出内容:
host-0 ec: 0 kafka_5.1.1-2_1 host-1 ec: 1 host-2 ec: 0 kafka_5.1.1-2_0 host-3 ec: 0 host-4 ec: 0 host-5 ec: 0
需求是提取并保存紧跟kafka行的主机名(如host-0、host-2),即仅提取下一行包含kafka的主机名。
用户计划的实现方式:将输出保存到文本文件,读取所有行存入数组,遍历数组找到kafka行后保存前一行索引对应的内容,询问该方法是否正确,或是否有更简便的实现方式。
解答
你的方法是完全正确的,逻辑清晰且能准确实现需求。不过针对这类CLI文本处理场景,有更简便的命令行工具实现方式,无需编写完整脚本:
方式1:使用awk命令
awk是处理这类行关联文本的利器,直接一行命令就能完成提取:
awk '/kafka/ {print prev} {prev=$1}' your_cli_output.txt
原理说明:
{prev=$1}:每一行执行时,把当前行的第一个字段(即主机名,比如host-0)存入变量prev/kafka/ {print prev}:当匹配到包含kafka的行时,打印之前存储的prev变量,也就是对应的主机名
如果直接处理CLI输出(无需先存文件),可以和原CLI命令结合使用:
your_original_cli_command | awk '/kafka/ {print prev} {prev=$1}'
方式2:你的原方法实现示例(以Python为例)
如果更倾向于用脚本实现,以下是基于你的思路的Python代码示例:
with open('your_cli_output.txt', 'r') as f: lines = [line.strip() for line in f if line.strip()] # 读取并过滤空行 result = [] for idx, line in enumerate(lines): if 'kafka' in line: # 取前一行的主机名(前一行格式是"host-x ec: x",分割后取第一个元素) host_line = lines[idx-1] host_name = host_line.split()[0] result.append(host_name) print('\n'.join(result))
两种方式最终都会得到正确结果:
host-0 host-2
内容的提问来源于stack exchange,提问作者Madhavi Deshpande
相关产品推荐
相关产品推荐

