如何用AWK从tnsnames.ora提取Oracle连接数据实现Jenkins自动化
基于tnsnames.ora构建Jenkins数据库自动化流程方案
我从数据提取到Jenkins落地,一步步给你拆解实现方法,再告诉你需要掌握的AWK核心知识点,完全贴合你的需求。
一、用AWK提取tnsnames.ora的关键数据
针对你给出的TNS配置格式,我们可以写一个精准的AWK脚本,提取BASE_NAME、HOST、PORT、SERVICE_NAME这四个核心字段。
示例AWK脚本
#!/usr/bin/awk -f # 匹配BASE_NAME行,提取配置名称(兼容带引号的场景) /^[[:space:]]*"?[A-Z0-9_]+[[:space:]]*=/ { gsub(/^[[:space:]]*"?|"?[[:space:]]*=.*/, "", $0) base_name = $0 } # 匹配HOST行,提取IP地址 /HOST=/ { gsub(/.*HOST=|).*/, "", $0) host = $0 } # 匹配PORT行,提取端口号 /PORT=/ { gsub(/.*PORT=|).*/, "", $0) port = $0 } # 匹配SERVICE_NAME行,提取服务名并输出完整结果,同时重置变量处理下一个配置块 /SERVICE_NAME=/ { gsub(/.*SERVICE_NAME=|).*/, "", $0) service_name = $0 printf "%s %s %s %s\n", base_name, host, port, service_name base_name = host = port = service_name = "" }
脚本使用方法
把脚本保存为tns_extractor.awk,执行以下命令即可得到你需要的输出格式:
awk -f tns_extractor.awk /path/to/your/tnsnames.ora
输出示例:
MY_BASE 10.20.30.40 1234 MY_SERVICE
这个脚本会自动跳过空行和注释,按TNS配置块依次提取输出,完美适配你给出的格式。
二、Jenkins自动化实现步骤
要在Jenkins里生成数据库复选框并批量执行操作,你需要用到参数化构建和Active Choices插件,具体步骤如下:
安装必要插件
- 确保Jenkins安装了
Active Choices插件(用于动态生成复选框选项),如果没有,直接从插件市场搜索安装即可。
- 确保Jenkins安装了
创建参数化构建任务
- 新建自由风格或流水线项目,勾选「此项目是参数化的」。
- 添加一个「Active Choices Parameter」类型的参数,名称设为
SELECTED_DBS,选择类型为「复选框」。 - 在「Script」区域选择「Groovy Script」,编写脚本调用AWK命令获取数据:
这样Jenkins会动态读取def output = sh(script: 'awk -f /path/to/tns_extractor.awk /path/to/tnsnames.ora', returnStdout: true).trim() return output.split("\n")tnsnames.ora的内容,把每个数据库连接作为复选框选项展示。
批量执行数据库操作
- 在构建步骤里添加「Execute shell」(Windows环境选批处理),遍历选中的数据库参数:
这样就能对所有选中的数据库执行相同的操作了。for db in ${SELECTED_DBS}; do # 拆分每个选项的字段,赋值给变量 BASE_NAME=$(echo $db | awk '{print $1}') HOST=$(echo $db | awk '{print $2}') PORT=$(echo $db | awk '{print $3}') SERVICE_NAME=$(echo $db | awk '{print $4}') # 这里替换成你的实际数据库操作,比如用sqlplus执行脚本 sqlplus username/password@//${HOST}:${PORT}/${SERVICE_NAME} @/path/to/your/sql_script.sql done
- 在构建步骤里添加「Execute shell」(Windows环境选批处理),遍历选中的数据库参数:
三、需要学习的AWK核心知识点
要理解并灵活修改上面的脚本,你只需要掌握AWK这几个核心内容:
- 模式-动作模型:AWK的核心逻辑是「匹配到指定模式,执行对应动作」,比如
/HOST=/就是匹配包含HOST=的行,然后执行提取IP的动作。 - 字符串处理函数:重点掌握
gsub()(全局替换),用来去掉冗余字符提取目标字段;另外match()、substr()也是处理文本的常用工具。 - 变量管理:AWK会自动初始化变量,你可以自定义变量存储提取的字段,比如
base_name、host,在合适的时机输出并重置。 - 格式化输出:用
printf或print控制输出格式,确保符合空格分隔的要求。
这些知识点足够你处理绝大多数tnsnames.ora的提取场景,后续遇到复杂格式(比如多地址配置),也能通过扩展模式匹配快速适配。
内容的提问来源于stack exchange,提问作者Jan Wit
相关产品推荐
相关产品推荐

