首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从shell脚本中Openstack创建命令的输出中获取‘in’字段

从shell脚本中Openstack创建命令的输出中获取‘in’字段
EN

Stack Overflow用户
提问于 2017-01-12 11:21:10
回答 5查看 1.6K关注 0票数 0

OpenStack命令(例如cinder createnova bootglance image-create)输出关于新卷/实例/映像的详细信息表。

代码语言:javascript
复制
$ cinder create --image 3896b01c-6afb-41a4-a207-3db87527be2c --display-name centos7-cloud 30
+---------------------+--------------------------------------+
|       Property      |                Value                 |
+---------------------+--------------------------------------+
|     attachments     |                  []                  |
|  availability_zone  |                 nova                 |
|       bootable      |                false                 |
|      created_at     |      2017-01-12T10:58:00.782361      |
| display_description |                 None                 |
|     display_name    |            centos7-cloud             |
|      encrypted      |                False                 |
|          id         | d1c6369b-73ce-498e-a2ef-2c6cea1d0f90 |
|       image_id      | 3896b01c-6afb-41a4-a207-3db87527be2c |
|       metadata      |                  {}                  |
|         size        |                  30                  |
|     snapshot_id     |                 None                 |
|     source_volid    |                 None                 |
|        status       |               creating               |
|     volume_type     |                 None                 |
+---------------------+--------------------------------------+

我正在创建一个shell脚本,其中下一个命令通过id引用新卷(在变量CINDER_ID中)。

代码语言:javascript
复制
nova boot --block-device source=volume,id=${CINDER_ID},dest=volume centos

id提取到变量的最佳方法是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-01-12 11:52:34

下面的解决方案使用GNU grep,它支持环顾四周。

代码语言:javascript
复制
grep -owP 'id.*\|\s\K.*[^\|]+' inputfile
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90

将其存储到变量:

代码语言:javascript
复制
id=$(grep -owP 'id.*\|\s\K.*[^\|]+' inputfile)

你可以试试:

代码语言:javascript
复制
 id=$(cinder create --image 3896b01c-6afb-41a4-a207-3db87527be2c --display-name centos7-cloud 30 |grep -owP 'id.*\|\s\K.*[^\|]+' )
票数 3
EN

Stack Overflow用户

发布于 2017-01-12 11:36:09

使用GNU awk's根子函数,您可以执行以下操作。下面的逻辑中的函数,从列2,3字段中移除前导和尾随空格--由|分隔。

(将表写入文件时检查)

代码语言:javascript
复制
awk -F"|" 'gensub(/^[ \t]+|[ \t]+$/,"","g",$2)=="id"{print gensub(/^[ \t]+|[ \t]+$/,"","g",$3);}' file
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90

要将它存储在变量中,

代码语言:javascript
复制
idValue="$(awk -F"|" 'gensub(/^[ \t]+|[ \t]+$/,"","g",$2)=="id"{print gensub(/^[ \t]+|[ \t]+$/,"","g",$3);}' file)"
printf "%s\n" "$idValue"
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90

您可以将生成上表的命令管道到此Awk,如

代码语言:javascript
复制
<your-command> | awk '{..}'

就像,

代码语言:javascript
复制
cinder create --image 3896b01c-6afb-41a4-a207-3db87527be2c --display-name centos7-cloud 30 \
       | awk -F"|" 'gensub(/^[ \t]+|[ \t]+$/,"","g",$2)=="id"{print gensub(/^[ \t]+|[ \t]+$/,"","g",$3);}'
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90
票数 2
EN

Stack Overflow用户

发布于 2017-01-12 11:54:35

您可以使用\s*\|\s*作为字段分隔符。

代码语言:javascript
复制
CINDER_ID=$(cinder create --image 3896b01c-6afb-41a4-a207-3db87527be2c --display-name centos7-cloud 30 |
awk 'BEGIN{FS="\\s*\\|\\s*"}$2=="id"{print $3}')
echo $CINDER_ID

你会得到

代码语言:javascript
复制
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41611932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档