对于这种特殊情况,可能比您需要的多一点,但如果您计划将 SQL 查询结果拉入您的 shell 脚本,那么这些东西可能会派上用场...
考虑将(数据库)字段值包装在一对不显示在字段中的分隔符中;示例可能包括竖线 (|)、句点 (.),甚至是多字符分隔符,这会增加在(数据库)字段中找不到匹配项的机会(例如,.|.)。
然后您可以让awk 使用相同的分隔符来分割字段。
您可以更进一步,通过提供一个用于 grep/pattern-match 的字段(例如,字符串 'GREPME')来标记数据行以供选择。这样就无需提前知道包含您的数据的行号。
让我们从 SQL 查询开始,我们将使用管道 (|) 作为分隔符:
$CMD_CONNX "select 'GREP'||'ME','|'||side_nbr||'|' from setup"
注意:为了避免匹配“GREPME”的列标题,我们需要将字符串分成两部分,从而确保只有数据行包含字符串“GREPME”。
注意:根据 RDBMS 和列数据类型,可能需要先将列转换为 (var)char,然后在列的前/后附加分隔符。
假设您的完整输出如下所示:
Connecting to database xyz ...
Connect as myuser/***** ...
GREP||ME |||side_nbr|||
=========== ==================
GREPME | 4|
(1 row affected)
解析出所需数据的一种awk 解决方案:
awk -F"|" '/GREPME/ {print $2}'
综合起来:
SIDE_NBR=$($CMD_CONNX "select 'GREP'||'ME','|'||side_nbr||'|' from setup" | awk -F"|" '/GREPME/ {print $2}')
如果您的 SQL 查询工具为结果集提供非空白列分隔符(例如,管道 (|)),会更有趣:
|Column1|Column2 |
|=======|=============|
|ABC |some data |
|DEF |and more data|
解析此输出存在问题,因为第一列的“额外”空白是由于列标题比数据宽,而对于第一行/第二列,由于第二行/第二列值更宽.
有几种方法可以解决这个问题......一个使用与号 (&) 作为分隔符的示例:
select 'GREP'||'ME&'||Column1||'&'||Column2||'&' from mytable
|GREP||ME&||Column1||&||Column2||&|
|=================================|
|GREPME&ABC&some data& |
|GREPME&DEF&and more data& |
可以像这样用awk 解析:
<select_query> ... | awk -F"&" '/GREPME/ {print $2,$3)' | while read -r col1 col2; do ...
Anyhoo,有很多方法可以对它进行切片,以便更轻松地将 SQL 结果集解析为可在 shell 脚本中使用的内容。
(显而易见的)总体思路是让 select 查询以允许 shell 脚本(更容易)解析的方式格式化您的数据。