4

我正在编写一个脚本,该脚本需要确定本地应用程序正在使用的数据库正在哪个节点上运行。我一直试图以此为契机,强迫自己学习 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 设置为一个或多个小写字母,后跟 0 或 1 个数字 Host = 。由于 (DESCRIPTION 是 $host 在 sed 语句之前和之后的开始,我不确定它是如何找不到它的,一个

4

6 回答 6

1

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

于 2018-02-06T20:58:16.563 回答
0

这可能对您有用:

db=spurs
host=$(sed '/^(/,/^)/!d;/^(/{h;d};H;/^)/!d;g;/'"$db"'/!d;s/.*Host=\([^)]*\).*/\1/' tnsnames.ora)
于 2012-05-19T15:01:10.200 回答
0

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

回声 $TNS_STRING | sed's/. 主机//g' | sed's/)。//g' | sed 's/=//g' | sed 's/\s*//g'

于 2012-05-17T21:20:04.793 回答
0

您可能最好依靠输出tnsping而不是解析文件: tnsping 似乎在一行上发出描述:

host=$(
  tnsping $db | while read line; do
    if [[ "$line" == *HOST* ]]; then
      s=${line#*HOST=}; s=${s%%)*}; echo "$s"; break
    fi
  done
)
于 2012-05-18T01:37:57.833 回答
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"

我已经切换回 just $host,没有 dbl 引号,因为您不希望数据中出现换行符。现在它都是一个大字符串,而正则表达式会剥离每个 upto host=,然后在第一个剩余)字符之后剥离所有内容。

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

我希望这有帮助。

于 2012-05-17T21:23:24.200 回答
-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;
于 2016-02-29T06:55:11.733 回答