将 awk 操作的结果放入变量时,结果被覆盖

将 awk 操作的结果放入变量时,结果被覆盖

我有一个 bash 脚本,它将:

  1. 调用一个名为 get-server-status.py 的 python 脚本
  2. 将这些结果通过管道传输到 awk 命令中,该命令将从此输出中获取 commit-sha
  3. 将最终结果放入名为“SERVERS”的变量中

我的 bash 脚本调用的 python 脚本返回以下内容:

2017-09-13 14:09:15 INFO: About to query Instance:i-01010abcde54345a4 
i-01010abcde54345a4 - 10.0.1.216: commit-sha = 0123456789

我希望仅获取“commit-sha”之后的字符,因此我使用以下代码将其导入 awk:

GET_SERVER_STATUS="./get-server-status.py --field=commit-sha -a"
$GET_SERVER_STATUS $SERVER_ASG_NAME | awk -F "commit-sha = " '{ print $2 }

这将返回我想要的内容:

0123456789

类似地,如果我的 python 脚本找到两台服务器并查询两个实例……:

2017-09-13 14:09:15 INFO: About to query Instance:i-01010abcde54345a4 
i-01010abcde54345a4 - 10.0.1.216: commit-sha = 0123456789
2017-09-13 14:09:15 INFO: About to query Instance:i-03949eifje34543g3 
i-03949eifje34543g3 - 10.0.2.246: commit-sha = 0123456789

我得到了两个提交 sha。正如我所希望的那样:

0123456789   
0123456789

但这就是问题所在。如果我尝试将这些结果放入变量中,即:

SERVERS=(`$GET_SERVER_STATUS $SERVER_ASG_NAME | awk -F "commit-sha = " '{ print $2 }'`)

它只会返回一个值而不是两个。

0123456789

这里发生了什么? awk 的第一个返回值放在变量中会被覆盖吗?

答案1

使用 Bash 的现代进程替换语法$( ... )或仅带有反引号的旧进程替换` ... `

SERVERS=$( $COMMAND $ARGUMENTS | awk -F "commit-sha = " '{ print $2 }' )

您编写的(` ... `)代码运行反引号内的代码,然后根据其单词创建一个列表/数组(这就是括号的作用)。如果您尝试像读取普通变量一样读取数组变量,则只会返回第一个数组元素。要获取其他元素,您必须指定索引。

$ text=(few words in here)
$ echo $text
few
$ echo ${text[1]}
words

我还想说,在这个用例中,grep使用后视可能是一种更直接的解决方案,尽管您的尝试似乎awk也是正确的。我想这主要是个人喜好问题,但我会这样写:

SERVERS=$( $COMMAND $ARGUMENTS | grep -Po '(?<=commit-sha = )\w+' )

注意:我用更短的变量名替换了原来的变量名,以便命令可以很好地放在一行中。

相关内容