我尝试构建自动化程序,该程序基于来自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学到什么(因为它是一个很大的工具)。
祝你好运!
答案 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 =到最近的“)”之后,并在它之后留出空格。
又一个新单词以一个字母开头,两端的“=”再次开始。
嗯......这是我的思维方式。我不知道这是一个合适的:/ 再次感谢你。
最好的问候。