我正在编写一个脚本,该脚本需要确定本地应用程序正在使用的数据库正在哪个节点上运行。我一直试图以此为契机,强迫自己学习 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 语句之前和之后的开始,我不确定它是如何找不到它的,一个