从TNS条目中提取主机名

时间:2012-05-17 21:08:50

标签: sed

我正在编写一个脚本,需要确定本地应用程序使用的数据库正在运行的节点。我一直试图用这个机会强迫自己学习awk / sed,并有一个测试脚本来测试语句。它正在处理我已移动到脚本所在的主文件夹的tnsnames.ora文件的副本。 这是一个有效的tnsnames.ora节:

(
   DESCRIPTION = (
   ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP) (Host=iplab)(Port=1521))
   ) 
   (CONNECT_DATA=(SID=spurs1)) 
)

在做了一些研究并获得awk表达式将tns条目拉到$ host后,我想出了下面的脚本,但它似乎不起作用。

#!/bin/ksh
db=spurs

host=$(awk -v db=$db "/${db}/ {for(i=1; i<=5; i++) {getline; print}}" tnsnames.ora)
echo $host
host= $host | sed 's/Host\s=\s\([a-z]+[0-9]?\)/\1/'
echo $host

当我运行awk语句时,我得到以下内容:

(DESCRIPTION = (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP) (Host=hostname)(Port=1521))) (CONNECT_DATA=(SID=spurs1)) )
./tns.ksh: line 6: (DESCRIPTION: not found
(DESCRIPTION = (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP) (Host=hostname)(Port=1521))) (CONNECT_DATA=(SID=spurs1)) )

从我所看到的阅读教程和论坛我认为sed设置正确,应该将$ host设置为一个或多个小写字母,然后在Host =后设置0或1个数字。因为(DESCRIPTION是sed语句之前和之后$ host的开头,我不确定它是怎么找不到的,

6 个答案:

答案 0 :(得分:1)

这对我有用: tnsping $db | grep HOST | cut -d\ -f 14 | sed 's/).*//g'

答案 1 :(得分:0)

在我的系统上,只要主机名没有等号(或主机名中的实际文字HOST),我就可以使用它来获取主机:

echo $ TNS_STRING | sed's /。 HOST // g'| sed's /). // g'| sed's / = // g'| sed's / \ s * // g'

答案 2 :(得分:0)

$ host的值可能是多行值,因此您需要在使用它的任何地方引用它,即

host=$(awk -v db=$db "/${db}/ {for(i=1; i<=5; i++) {getline; print}}" tnsnames.ora)
echo "$host"

您还需要通过$(...)

捕获输出(使用命令替换)
host=$(echo "$host" | sed 's/Host\s=\s\([a-z]+[0-9]?\)/\1/')
echo "$host"

(并回显它),因此它可以由sed

处理

<强>修订

host=$(echo $host | sed 's/.*Host=//; s/).*$//)
echo "$host"

我已经切换回$host,没有dbl-quotes,因为你不想要数据中的换行符。现在它只是一个大字符串,正则表达式,每个都去除host=,然后在第一个剩余的)字符后删除所有内容。

如果您仍然收到错误消息,我无法访问tnsnames.ora记录,因此请编辑您的查询以包含有效记录。

我希望这会有所帮助。

答案 3 :(得分:0)

你可能更好地依赖tnsping的输出而不是解析文件:tnsping似乎在一行上发出描述:

host=$(
  tnsping $db | while read line; do
    if [[ "$line" == *HOST* ]]; then
      s=${line#*HOST=}; s=${s%%)*}; echo "$s"; break
    fi
  done
)

答案 4 :(得分:0)

这可能对您有用:

db=spurs
host=$(sed '/^(/,/^)/!d;/^(/{h;d};H;/^)/!d;g;/'"$db"'/!d;s/.*Host=\([^)]*\).*/\1/' tnsnames.ora)

答案 5 :(得分:-2)

经过测试的代码:

OIFS=$IFS;
IFS="(";
tns=`tnsping TNS_ALIAS`
tns_arr=($tns);
tns_info=(`(for ((i=0; i<${#tns_arr[@]}; ++i)); do  echo "${tns_arr[$i]/)/}"; done)| grep 'HOST\|PORT'|sed 's/)//g'|sed 's/ //g'`)
for ((i=0; i<${#tns_info[@]}; ++i)); do eval "export ${tns_info[$i]}"; done
echo "host:" $HOST
echo "port:" $PORT
IFS=$OIFS;