首页 > 解决方案 > 通过 awk 从 tnsnames.ora 获取连接数据

问题描述

我尝试构建基于来自 tnsnames.ora 的连接数据的自动化程序,tnsnames.ora 是数据库的 oracle 连接基础。

典型的 TNS 构建看起来像这样,但连接比 1 多得多:

" 

MY_BASE= 
  (DESCRIPTION= 
    (ADDRESS= 
      (PROTOCOL=TCP) 
      (HOST=10.20.30.40) 
      (PORT=1234) 
    ) 
    (CONNECT_DATA= 
      (SERVER=dedicated) 
      (SERVICE_NAME=MY_SERVICE) 
    ) 
  ) 

"

我需要提取基本连接数据,这将是:BASE_NAME HOST PORT SERVICE_NAME 或多或少看起来像

MY_BASE 10.20.30.40 1234 MY_SERVICE

一些连接有不止一项服务,但我不会用这些来打扰你,因为我不知道最后如何使它成为变量:P

我的意思是在 jenkins 自动化中创建一个列表,并使其在复选框中返回连接列表。比我从这些连接数据中生成变量,这样我就可以同时在许多数据库上做同样的事情。

或多或少...

任何想法?阅读什么,找到什么,从 AWK 学习什么(因为它是一个大工具)。

此致!

标签: oracleshelljenkinsawktnsnames

解决方案


以下awk可能会对您有所帮助(如果有多个 TNS 条目,它也应该可以工作)。

awk -F"[=)]" '
/^"/{
  flag=1;
  next}
flag && NF{
  value=$1;
  flag=""}
/HOST/{
  value=value OFS $(NF-1);
  next}
/PORT/{
  value=value OFS $(NF-1);
  next}
/SERVICE_NAME/{
  print value OFS $(NF-1);
  value=""}
END{
  if(value){
    print value}
}'   Input_file

执行上述命令:假设以下是测试 Input_file。

cat Input_file
"

MY_BASE=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=yourip)
      (PORT=1234)
    )
    (CONNECT_DATA=
      (SERVER=dedicated)
      (SERVICE_NAME=MY_SERVICE)
    )
  )
"

"

MY_BASE=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=yourip)
      (PORT=1234)
    )
    (CONNECT_DATA=
      (SERVER=dedicated)
      (SERVICE_NAME=MY_SERVICE)
    )
  )


"

现在在运行上面的代码之后将输出。

MY_BASE yourip 1234 MY_SERVICE
MY_BASE yourip 1234 MY_SERVICE

推荐阅读