我的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,如果有人可以提供帮助
答案 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)
时打印出来