【问题标题】:Fetching connection data from tnsnames.ora via awk通过 awk 从 tnsnames.ora 获取连接数据
【发布时间】:2018-05-28 14:22:06
【问题描述】:

我尝试构建基于来自 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 主机端口 SERVICE_NAME 或多或少看起来像

MY_BASE 10.20.30.40 1234 MY_SERVICE

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

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

或多或少...

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

最好的问候!

【问题讨论】:

  • 为什么不用tnsnames.ora文件建立连接?参见例如here

标签: oracle shell jenkins awk tnsnames


【解决方案1】:

如果这还不是你所需要的:

$ cat tst.awk
BEGIN { FS="[()=]" }
NF==2 && /=/ { f["BASE_NAME"] = $1 }
NF==4 { f[$2] = $3 }
END { print f["BASE_NAME"], f["HOST"], f["PORT"], f["SERVICE_NAME"] }

$ awk -f tst.awk file
MY_BASE 10.20.30.40 1234 MY_SERVICE

然后编辑您的问题以阐明您的要求并提供更具代表性的示例输入/输出。

【讨论】:

    【解决方案2】:

    关注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
    

    【讨论】:

      【解决方案3】:

      首先,感谢您的回答。 一般来说,我检查过,看起来我的 tnsnames 没有像我年轻时那样标准化。

      第一个结果很好,喜欢

      MY_BASE 10.20.30.40 1234 MY_SERVICE
      

      但进一步分析表明,结果看起来像……

      10.20.30.40 1234 MY_SERVICE MY_BASE 
      

      或

      MY_SERVICE 1234 10.20.30.40 
      

      等等……

      整个结果移动,我无法对其进行变量化。

      是否有办法防止结果掉入第二行或防止在一行中出现几个不同的结果?

      就像让它通常阅读... 在新行结果中设置以 LETTER(不是数字或特殊符号)开头并以“=”符号结尾。 在它之后设置 HOST= 和最近的 ")" 符号之间的值,并在它之后留下 spacia。 在它之后将 PORT= 之间的值设置为最接近的 ")" 符号并在其后留出空格。 将 SERVICE_NAME= 之间的值设置为最近的 ")" 并在其后留出空格。

      又是一个以字母开头的新单词,结尾有“=”。

      嗯……这是我的想法。我不知道它是否合适:/ 再次感谢您。

      最好的问候。

      【讨论】:

        猜你喜欢
        • 2019-11-12
        • 1970-01-01
        • 2021-10-16
        • 1970-01-01
        • 2017-06-21
        • 2023-03-11
        • 2011-01-01
        • 2010-10-23
        • 1970-01-01
        相关资源
        最近更新 更多