我有一个SQL脚本,可以获取有关FRA(ORACLE中的Flash恢复区)的详细信息,该脚本只需要在DB中运行,而不能在任何其他oratab条目中运行。所以在下面的例子中,我需要它只在dbname1和dbname2中执行,并在找到时忽略其余的条目。
示例oratab文件:
dbname1:/u01/app/oracle/11.2.0.4/db_1:Y
dbname2:/u01/app/oracle/12.2.0.1/db_2:Y
+ASM:/u01/app/grid:N
MGMTDB:/u01/app/grid:N
AGENT:/u01/app/agent_home:N
我写了一个我正在使用的功能,并且根据我的要求不能正常工作。非常感谢任何变化。
checkORATAB()
{
ORATAB=/etc/oratab
SID=`egrep -i ":Y|:N" $ORATAB | cut -d":" -f1 |grep -v "\#"|grep -v "\*"`
export $SID
if [[ `echo "$ORACLE_SID" | cut -b 1` != '+' ]] && [[ "$ORACLE_SID" != "AGENT" ]] && [[ "$ORACLE_SID" != "GRID" ]] && [[ "$ORACLE_SID" != "-MGMTDB" ]] && [[ "$ORACLE_SID" != "+ASM" ]]; then
for i in $SID; do
runscript;
fi
done
exit;
}
由于
答案 0 :(得分:0)
这是awk
或sed
的工作,但grep
和cut
的组合也可以。
checkORATAB() {
ORATAB=/etc/oratab
for sid in $(awk -F: '$1 !~ /(+ASM|MGMTDB|AGENT)/ {print $1}' $ORATAB)
do
export ORACLE_SID=$sid
runscript
done
}
或使用sed
:
checkORATAB() {
ORATAB=/etc/oratab
for sid in $(sed -n '/^\(+ASM\|MGMTDB\|AGENT\)/b;s/:.*//p' $ORATAB)
do
export ORACLE_SID=$sid
runscript
done
}