将Teradata BTEQ查询结果输入到unix变量中

时间:2014-09-15 05:30:59

标签: shell unix ksh teradata

我正在编写一个shell脚本,我需要将Teradata中的BTEQ查询结果转换为unix变量。

我试过了,

    testabcd=$(bteq << EOF 2>&1 >> $LOG_FILE
     .LOGON ${HOST}/${USER},${PASSWORD}
     DATABASE ${SRC_DB};
     .set width 2000;
      .set titledashes off;
     SELECT COUNT(*) FROM ${SRC_DB}.${SOURCE_TABLE};
    .LOGOFF;
    .QUIT;
    .EXIT
     EOF)

      echo "The count is: " $testabcd

查询成功运行但变量未分配输出。有什么建议吗?

5 个答案:

答案 0 :(得分:4)

问题在于重定向:

2>&1 >> $LOG_FILE

这实际上意味着&#34;将stderr和stdout发送到文件$ LOG_FILE&#34;。由于stderr和stdout被重定向,该命令不会向shell发送任何输出,因此命令替换不会捕获任何内容。例如:

$ test=$(echo "Hello" 2>&1)
$ echo $test
Hello   // as expected
$ test2=$(echo "Hello" 2>&1 >> example.log)
$ echo $test2
        // is empty, as output has been redirected
$ cat example.log
Hello   // here is the redirected output

bteq命令的输出将在$LOG_FILE内找到 - 如果你想将它保存在变量中,那么你需要删除重定向:

testabcd=$(bteq << EOF 2>&1 
....

答案 1 :(得分:2)

无需额外文件:

testabcd=$(bteq << EOF 2>&1  |grep '^>' |sed -e "s/^>//"
 .LOGON ${HOST}/${USER},${PASSWORD}
 DATABASE ${SRC_DB};
 .set width 2000;
  .set titledashes off;
 SELECT '>'||COUNT(*) FROM ${SRC_DB}.${SOURCE_TABLE};
.LOGOFF;
.QUIT;
.EXIT
 EOF)

'>'||COUNT(*)> 标记我们真正想要查询的输出。

grep '^>':过滤标记的文字。避免bteq瑕疵。

sed -e "s/^>//"删除标记 >

答案 2 :(得分:0)

尝试这种方式:

testabcd(){
bteq << EOFBT |grep '^>' |sed -e "s/^>//"
.SET ERROROUT STDOUT
.SET ECHOREQ ON
.SET INDICDATA OFF
.SET QUIET OFF
.SET SIDETITLES OFF
.SET TIMEMSG QUERY
.SET TITLEDASHES OFF

.LOGON ${LOGIN_TD_DWC};

 SELECT '>'||'ANTON';

 .LOGOFF;
.QUIT;
EOFBT
}

var_test=$(testabcd)

echo $var_test

答案 3 :(得分:-1)

我无法找到将查询输出分配给变量的任何直接方法,而是必须将输出写入文件并读取它。

      ERR_COUNT_FILE="err_count.txt"
      cat null > $ERR_COUNT_FILE
      bteq << EOF >>${LOG_FILE} 2>&1
      .LOGON ${HOST}/${USER},${PASSWORD}
         DATABASE ${SRC_DB};
         .set titledashes off;
         .set heading '';
      .EXPORT FILE=${ERR_COUNT_FILE}

      SELECT COUNT(*) from ${SRC_DB}.${SOURCE_TABLE};

      .EXPORT RESET
      EOF
      sed -i '1d;s/[[:blank:]]//g' $ERR_COUNT_FILE /* Remove header line and all blank spaces from the file*/
      count_err=$(cat ${ERR_COUNT_FILE})
      echo $count_err

我找不到更简单的方法。

答案 4 :(得分:-1)

尝试使用:

count=$(echo "SELECT '>'||COUNT(*) FROM YOUR_DBNAME.YOUR_TABLENAME" | bteq .LOGON ${HOST}/${USER},${PASSWORD} 2>&1 |grep '^>' |sed -e "s/^>//");

使用这个,我们写一行 bteq查询,结果存储在变量count中,因此可以使用。

无需额外的文件或其他任何内容。