shell脚本从ORATAB文件中排除+ ASM,AGENT,-MGMTDB的条目,只验证DBSID

时间:2017-07-18 14:33:32

标签: shell sh ksh

我有一个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;
}

由于

1 个答案:

答案 0 :(得分:0)

这是awksed的工作,但grepcut的组合也可以。

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
}