tnsnames.ora上的正则表达式

时间:2017-03-09 09:06:53

标签: regex oracle bash

我的tnsnames.ora文件有两种格式: db_cl =   (DESCRIPTION =     (ADDRESS =(PROTOCOL = TCP)(HOST = a55)(PORT = 1522))     (CONNECT_DATA =       (SERVER = DEDICATED)       (SERVICE_NAME = cl)     )   )

dbcd =   (DESCRIPTION =     (ADDRESS =(PROTOCOL = TCP)(HOST = a66)(PORT = 1521))     (CONNECT_DATA =       (SERVER = DEDICATED)       (SERVICE_NAME = cd)     )   )

myx5 =   (DESCRIPTION =     (ADDRESS =(PROTOCOL = TCP)(HOST = v55)(PORT = 1521))     (CONNECT_DATA =       (SERVER = DEDICATED)       (SERVICE_NAME = x5)     )   )

我想获取特定service_name或sid的主机名。在某些情况下,它是sid,在某些情况下,它是service_name。我应该用grep搜索才能获得主机名?在这个例子中,我想得到字符串" host_name"。

**** **** UPDATE 我还需要db_name2,如果有人可以提供帮助

2 个答案:

答案 0 :(得分:1)

@drf:试试:

 awk '/HOST/{sub(/).*/,"",$(NF-2));print $(NF-2)}'   Input_file

只需查找每一行的字符串HOST,然后从awk与其中的字符串HOST匹配的行的第二个最后一个字段中替换。),那么它应该给你host_name。

编辑:要查找特定的SID或服务名称,请尝试:

awk '/HOST/{sub(/).*/,"",$(NF-2));HOST=$(NF-2);next} /SID/{print HOST}'

使用要搜索的sid或服务名称更改SID,然后它应该可以正常工作。

EDIT2:

awk '/db_name/{sub(/=/,"",$1);DB=$1}/HOST/{sub(/).*/,"",$(NF-2));HOST=$(NF-2);next} /chumma/{print DB ORS HOST}'

EDIT3:

awk '{gsub(/\)|\(/,"");;for(i=1;i<=NF;i++){if($i=="HOST"){host=$(i+1)};if($NF=="cd"){val="DB_NAME= "$1", HOST_NAME= "host",SID/SERVICE_NAME= "$NF}};if(val){print val;val=""}}'  Input_file

OR(非一种衬里形式的溶液也如下):

awk '{gsub(/\)|\(/,"");
      for(i=1;i<=NF;i++){
                                if($i=="HOST"){
                                                host=$(i+1)
                                              };
                                if($NF=="cd") {
                                                val="DB_NAME= "$1", HOST_NAME= "host",SID/SERVICE_NAME= "$NF
                                              }
                        };
      if(val)           {
                                print val;
                                val=""
                        }
     }
    '   Input_file

您可以在上面的代码中将“cd”放置为您要搜索的其他服务或ssid。

答案 1 :(得分:1)

如果perl可用,请尝试以下命令:

perl -nle 'BEGIN{$service = shift}
    $host = $1 if /HOST\s*=\s*([^\s\)]+)/i;
    print $host if /\((SID|SERVICE_NAME)\s*=\s*$service\)/;
' blabla tnsnames.ora

它存储HOST = ...中找到的最后一个主机值,并在遇到(**SID/SERVICE_NAME** = blabla)时打印出来