将我的 "Sybase" 查询结果/输出存储到脚本变量中
Store my "Sybase" query result /output into a script variable
我需要一个变量来保存从脚本中的查询 (Sybase) 检索到的结果。
我构建了以下脚本,它工作正常我在 运行 时得到了想要的结果
脚本:EXECUTE_DAILY:
isql -U database_dba -P password <<EOF!
select the_name from table_name where m_num="NUMB912" and date="17/01/2019"
go
quit
EOF!
echo "All Done"
输出:
"EXECUTE_DAILY" 97 lines, 293 characters
user@zp01$ ./EXECUTE_DAILY
the_name
-----------------------------------
NAME912
(1 row affected)
但现在我想将输出(the_name: NAME912)
保存在一个变量中。
到目前为止,这基本上是我正在尝试但没有成功的方法。
variable=$(isql -U database_dba -P password -se "select the_name from table_name where m_num="NUMB912" and date="17/01/2019" ")
但是,不起作用。我无法将 NAME912 保存在变量中。
您需要解析想要存储在变量中的所需 string/piece-of-data 的输出。我倾向于通过确保我可以 easily/quickly search/parse 得到我想要的东西来让我的生活更轻松。
记住几个问题...
我倾向于使用 isql -s"|" -w10000
来确保(大部分时间)a) 结果集的所有列都用竖线 ('|') 分隔,b) 单个一行数据不跨越多行;竖线分隔符可以更轻松地解析出可能包含白色 space 的列;显然(?)如果管道可能是您实际数据的一部分,请使用不同的分隔符
为了使 isql
输出的解析更容易一些,我倾向于向要查找的行添加一个唯一的 grep-able(文字)字符串 search/parse
一些数据库(例如 SQLAnywhere、Oracle)倾向于模仿一个文字值作为列 header,如果所述文字字符串没有被显式分配 alias/header;这意味着如果您对文字字符串进行简单搜索,那么您将获得结果集 header 以及实际数据行
的匹配项
我倾向于将所有 isql
输出捕获到一个临时文件;这允许更容易 follow-on 处理,例如错误检查、数据解析、将内容转储到日志文件等
因此,考虑到上述情况,我的代码通常类似于:
$ outfile=/tmp/.$$.isql.outfile
$ isql -s"|" -w10000 -U database_dba -P password <<-EOF > ${outfile} 2>&1
-- 'GREP'||'ME' ensures that 'GREPME' only shows up in the data row
select 'GREP'||'ME',the_name
from table_name
where m_num = "NUMB912"
and date = "17/01/2019"
go
EOF
$ cat ${outfile}
... snip ...
|'GREP'||'ME'|the_name | # notice the default column header = 'GREP'||'ME' which won't match my search for 'GREPME'
|------------|----------|
|GREPME |NAME912 | # this is the line I want to search/parse
... snip ...
$ read -r namevar < <(egrep GREPME ${outfile} | awk -F"|" '{print }')
$ echo ${namevar}
NAME912
我需要一个变量来保存从脚本中的查询 (Sybase) 检索到的结果。
我构建了以下脚本,它工作正常我在 运行 时得到了想要的结果 脚本:EXECUTE_DAILY:
isql -U database_dba -P password <<EOF!
select the_name from table_name where m_num="NUMB912" and date="17/01/2019"
go
quit
EOF!
echo "All Done"
输出:
"EXECUTE_DAILY" 97 lines, 293 characters
user@zp01$ ./EXECUTE_DAILY
the_name
-----------------------------------
NAME912
(1 row affected)
但现在我想将输出(the_name: NAME912)
保存在一个变量中。
到目前为止,这基本上是我正在尝试但没有成功的方法。
variable=$(isql -U database_dba -P password -se "select the_name from table_name where m_num="NUMB912" and date="17/01/2019" ")
但是,不起作用。我无法将 NAME912 保存在变量中。
您需要解析想要存储在变量中的所需 string/piece-of-data 的输出。我倾向于通过确保我可以 easily/quickly search/parse 得到我想要的东西来让我的生活更轻松。
记住几个问题...
我倾向于使用
isql -s"|" -w10000
来确保(大部分时间)a) 结果集的所有列都用竖线 ('|') 分隔,b) 单个一行数据不跨越多行;竖线分隔符可以更轻松地解析出可能包含白色 space 的列;显然(?)如果管道可能是您实际数据的一部分,请使用不同的分隔符为了使
isql
输出的解析更容易一些,我倾向于向要查找的行添加一个唯一的 grep-able(文字)字符串 search/parse一些数据库(例如 SQLAnywhere、Oracle)倾向于模仿一个文字值作为列 header,如果所述文字字符串没有被显式分配 alias/header;这意味着如果您对文字字符串进行简单搜索,那么您将获得结果集 header 以及实际数据行
的匹配项
我倾向于将所有
isql
输出捕获到一个临时文件;这允许更容易 follow-on 处理,例如错误检查、数据解析、将内容转储到日志文件等
因此,考虑到上述情况,我的代码通常类似于:
$ outfile=/tmp/.$$.isql.outfile
$ isql -s"|" -w10000 -U database_dba -P password <<-EOF > ${outfile} 2>&1
-- 'GREP'||'ME' ensures that 'GREPME' only shows up in the data row
select 'GREP'||'ME',the_name
from table_name
where m_num = "NUMB912"
and date = "17/01/2019"
go
EOF
$ cat ${outfile}
... snip ...
|'GREP'||'ME'|the_name | # notice the default column header = 'GREP'||'ME' which won't match my search for 'GREPME'
|------------|----------|
|GREPME |NAME912 | # this is the line I want to search/parse
... snip ...
$ read -r namevar < <(egrep GREPME ${outfile} | awk -F"|" '{print }')
$ echo ${namevar}
NAME912