Shell 用于排除+;ASM,AGENT,-MGMTDB来自ORATAB文件,只需验证DBSIDs即可

Shell 用于排除+;ASM,AGENT,-MGMTDB来自ORATAB文件,只需验证DBSIDs即可,shell,sh,ksh,Shell,Sh,Ksh,我有一个SQL脚本,可以获取FRA(ORACLE中的闪存恢复区域)的详细信息,该脚本只需要在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

我有一个SQL脚本,可以获取FRA(ORACLE中的闪存恢复区域)的详细信息,该脚本只需要在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;
}

谢谢

这是一份针对
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
}

虽然我大致了解了
oratab
文件的外观,但我不确定您所说的
FRA
是什么意思;还有一点被
仅验证DBSID
仅捕获DBSID
混淆了;我建议你更新你的问题,你需要更新/编辑你的原始文章与所有这些额外的细节;其他回答这个问题的人不会费心通读所有的评论,然后试图把所有的片段组合成一个连贯的问题;你看过我在第一次评论中提供的链接了吗?我建议你也看看谢谢markp指导我正确发布它。我是stackoverflow的初学者,不会再重复这个错误了<代码>awk-F:'$1!~/(+ASM | MGMTDB | AGENT)/{print$1}'/etc/oratab将只打印两个SID。或者使用
sed-n'/^\(+ASM\| MGMTDB\| AGENT\)/b;s/:.*//p'/etc/oratab