我正在编写一个脚本,需要确定本地应用程序使用的数据库正在运行的节点。我一直试图用这个机会强迫自己学习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的开头,我不确定它是怎么找不到的,
答案 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;