linux - 在 shell 脚本中解析 oracle SQLPLUS 错误消息以发送电子邮件

标签 linux oracle bash awk

我正在尝试从 Oracle 错误消息中提取一个子字符串,以便我可以使用 awk 将其通过电子邮件发送给管理员,这部分代码试图找到我想要提取的重要位。

开始这里是我所拥有的......

(表名不正确产生错误)

validate_iwpcount(){

    DB_RETURN_VALUE=`sqlplus -s $DB_CRED <<END
    SELECT count(COLUMN)
    FROM INCORRECT_TABLE NAME;
    exit
    END`


    a="$DB_RETURN_VALUE"
    b="ERROR at line"
    awk -v a="$a" -v b="$b" 'BEGIN{print index(a,b)}'

    echo $DB_RETURN_VALUE

}

奇怪的是,无论 awk 的返回值 $DB_RETURN_VALUE 有多大,它的返回值始终为 28。我假设在此错误消息中的某处有一些 linux 认为是某种隐式定界符并且它与计数或其他东西混淆陌生人。这适用于常规字符串,而不是 oracle 给我的。

有人可以照亮这个吗?

非常感谢

最佳答案

28 似乎是您查询的正确答案(稍作修改以避免 ORA-00936,并在脚本中使用制表符)。您回显的消息包括文件扩展;原始消息是:

        FROM IW_PRODUCTzS
             *
ERROR at line 2:
ORA-00942: table or view does not exist

* 在您 echo $DB_RETURN_VALUE 时展开,因此您执行此操作的目录似乎有 logs mail_files scripts它,并且它们通过 * 的扩展显示。如果您从不同的目录运行它,回显 消息的长度会有所不同,但来自 Oracle 的实际消息的长度保持不变 - 在 SQL*Plus 调用和在 awk 完成它的工作之后。您可以使用 echo "$DB_RETURN_VALUE" 来避免这种扩展,尽管我认为您实际上并不希望最终看到完整的消息。

字符 28 的子串给了你想要的:

validate_iwpcount(){

    DB_RETURN_VALUE=`sqlplus -s $CENSYS_ORACLE_UID <<END
    SELECT count(COLUMN_NAME)
    FROM IW_PRODUCTzS;
    exit
    END`

    # To see the original message; note the double-quotes
    # echo "$DB_RETURN_VALUE"

    a="$DB_RETURN_VALUE"
    b="ERROR at line"
    p=`awk -v a="$a" -v b="$b" 'BEGIN{print index(a,b)}'`

    if [ ${p} -gt 0 ]; then
        awk -v a="$a" -v p="$p" 'BEGIN{print substr(a,p)}'
    fi

}

validate_iwpcount

... 仅显示:

ERROR at line 2:
ORA-00942: table or view does not exist

我确信这可以简化,也许可以简化为单个 awk 调用,但我对此并不熟悉。

关于linux - 在 shell 脚本中解析 oracle SQLPLUS 错误消息以发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20662343/

相关文章:

php - 符号链接(symbolic link)到 hhvm 的行为与二进制文件不同

linux - 是否总是再次从符号 namespace 的根开始查找不同共享库中的相同符号?

mysql - MySQL中Rank和DenseRank的实现

java - 从 PL/SQL 中的数据创建 "on the fly"图形图像

linux - 如何通过 SSH bash 脚本在远程服务器上进行 cd?

linux - 在 headless (headless)虚拟机上禁用监视器

oracle - Grails的save(flush:true)将线程卡在socketRead0中

linux - 使用 HTTP 存储 git 命令的凭据

bash - 如何获取括号中的值?

bash - 将 globbing 的结果分配给 Bash 中的变量