通过awk从tnsnames.ora获取连接数据

时间:2018-05-28 14:22:07

标签: oracle shell jenkins awk tnsnames

我尝试构建自动化程序,该程序基于来自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学到什么(因为它是一个很大的工具)。

祝你好运!

3 个答案:

答案 0 :(得分: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

然后编辑您的问题以阐明您的要求,并提供更具真实代表性的样本输入/输出。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

首先,谢谢你的回答。 一般来说,我已经检查过,看起来我的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开头(不是数字或特殊符号),以“=”sighn结束。 设置在HOST =和最接近的“)之后的值,然后在它之后离开spacia。 在它之后设置值PORT =到最接近的“)”signt并在它之后留空间。 在它之后设置值在SERVICE_NAME =到最近的“)”之后,并在它之后留出空格。

又一个新单词以一个字母开头,两端的“=”再次开始。

嗯......这是我的思维方式。我不知道这是一个合适的:/ 再次感谢你。

最好的问候。