【问题标题】:Awk appears to disconnect my DB2 session when piping管道时,Awk 似乎断开了我的 DB2 会话
【发布时间】:2010-10-05 08:56:03
【问题描述】:

我正在尝试在 KornShell (ksh) 中运行以下命令:

set -A INDEXES `db2 "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail" | awk '{print $1"."$2}'`

我试图实现的是将特定表上的索引列表放入一个数组中,以后可以对其进行迭代。

问题是,当我运行上述命令时,数组的内容以“SQL1024N”的错误消息开头(告诉我数据库连接不存在)。

但是,如果我删除语句末尾的awk,如下所示:

set -A INDEXES `db2 "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail"`

它工作得很好(嗯,在某种程度上它正在返回数据。显然没有awk 我没有捕获正确的数据)。

有人知道为什么awk 会产生这种影响吗?

我很欣赏有不止一种方法可以获取这些数据,但我不知道为什么会发生这种情况。

提前致谢。

【问题讨论】:

    标签: shell scripting awk db2 ksh


    【解决方案1】:

    在这种情况下,当DB2 CLP说它没有连接到数据库时,是因为shell开辟了一个子进程,该子进程需要自己专用的db2bp后端进程,无法访问原来shell打开的连接过程。并不是说某些东西断开了,而是正在创建一个新创建的 shell 进程(及其附带的 db2bp 进程),但没有被告知要连接到数据库。 解决此问题的一种方法是在您知道自己处于其中一种情况时显式连接(或重新连接)到数据库。

    set -A INDEXES `db2 connect to watevrDB >/dev/null;db2 -x describe indexes for table ${TABSCHEMA}.${TABNAME} show detail | awk {'print $1"."$2'}`
    

    我意识到这个问题更多是关于使用 DB2 编写脚本和 awk,而不是关于系统目录,否则我会推荐一些简单的目录查询来产生相同的结果。

    【讨论】:

    • 顺便说一句:我对此尝试的肮脏解决方法(它本身很可能被归类为肮脏的解决方法)是运行 db2look 并使用 awk 来模拟多行grep(使用 grep 在 ksh 中无法完成的事情)我设法获取了索引列表。
    • db2look 实用程序是为对象生成完整 DDL 的好方法,但如果您只对索引的内容感兴趣,SYSCAT.INDEXES 视图有很多有用的细节。跨度>
    【解决方案2】:

    尝试带有 -x 开关的 db2 命令:

    db2 **-x** "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail"....

    我遇到过这样的情况,这可以解决我无法通过管道输出到 awk 的问题。

    【讨论】:

    • 公平点。不幸的是,我开始使用 -x 开关。出于某种原因,我没有在上面的示例中包含它。感谢您的尝试!
    【解决方案3】:

    这是一个不寻常的问题,正如 Pez 所说,它可能是一个 db2 怪癖。

    我遇到过类似的问题,例如在 db2 命令字符串之前使用 time 或 timex,其中 db2 没有定义的数据库要连接。

    有一个环境变量 DB2DBDFT 为隐式连接设置默认数据库。很抱歉,我不确定非 DBA 用户是否可以使用此变量(假设您是应用程序开发人员)。是否通过以下方式设置此变量值得研究:

    db2set DB2DBDFT=${your_db_name}

    然后重试您的查询。

    如果您的环境可以连接多个数据库,您可以在完成工作后取消设置 DB2DBDFT 变量。

    【讨论】:

    • 感谢您对此的回答。我将与我们的 DBA 交谈并提及您的建议。当我第一次向我们的 DBA 展示这个时,他们只是耸了耸肩。考虑到这一点,再次感谢您抽出宝贵时间回答。
    【解决方案4】:

    我怀疑它本身就是 awk。也许 db2 对连接到 tty 或控制台的标准输出特别感兴趣?或者至少不喜欢它连接到管道。

    【讨论】:

    • 作为一个测试,当您在命令行上将“db2 ... | awk ...”作为普通命令运行时会发生什么?另外,习惯使用 $(...) 而不是反引号;管理报价要容易得多。由于反引号捕获输出(通过文件或管道),因此管道到 awk 的重要性尚不清楚。
    • 您好乔纳森 抱歉延迟回复。我才发现这个评论。当“db2 | awk”命令在反引号之外运行时,它会按预期工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多