【问题标题】:Do NOT remove spaces in a variable不要删除变量中的空格
【发布时间】:2020-02-14 21:10:11
【问题描述】:

我正在 bash 脚本中创建一个变量,以从 sql 数据库中提取一个字段。那里可能有空间,我想看看。

SIDE_NBR=$($CMD_CONNX "select side_nbr from setup" | awk 'NR==6{print$1}'|tr -d '\r'

我需要 tr -d '\r' 因为它带有回车符。但是,这个字段可能是

"    4"

"4"

我想看到这些空格,所以当我稍后调用我的变量时,我可以

log "Side_nbr=\"$SIDE_NBR\""

在我的日志中会显示“4”或“4”

【问题讨论】:

  • 这是我的想法,但不是这样。
  • {print $1} 将使用默认分隔符删除所有前导空格。
  • 问题是awk使用空格将行分割成字段。
  • 改用awk 'NR==6'
  • 你只打印 $1 而不是整行有什么原因吗?

标签: sql linux bash variables


【解决方案1】:

发布官方答案。

awk 中的

{print$1} 将删除前导空格。

仅使用“NR==6”就可以满足我的需求。谢谢大家!

【讨论】:

  • 删除空格的不是print。默认情况下,all 空格被视为字段分隔符;一旦awk 将当前行拆分为字段,空格就会被删除。
【解决方案2】:

对于这种特殊情况,可能比您需要的多一点,但如果您计划将 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 脚本(更容易)解析的方式格式化您的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 2020-04-21
    • 2018-12-27
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多