从shell脚本中的Openstack创建命令输出中获取`id`字段

时间:2017-01-12 11:21:10

标签: bash shell awk openstack

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

$ 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中)。

nova boot --block-device source=volume,id=${CINDER_ID},dest=volume centos

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

6 个答案:

答案 0 :(得分:3)

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

grep -owP 'id.*\|\s\K.*[^\|]+' inputfile
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90

将其存储到变量中:

id=$(grep -owP 'id.*\|\s\K.*[^\|]+' inputfile)

您可以尝试:

 id=$(cinder create --image 3896b01c-6afb-41a4-a207-3db87527be2c --display-name centos7-cloud 30 |grep -owP 'id.*\|\s\K.*[^\|]+' )

答案 1 :(得分:2)

使用GNU awk'sgensub-function,您可以执行以下操作。以下逻辑中的函数从{2,3}字段分隔的列2,3中删除前导和尾随空格

(将表格写入文件进行检查)

|

将其存储在变量

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

您可以将生成上表的命令通过管道传输到此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

类似的东西,

<your-command> | awk '{..}'

答案 2 :(得分:2)

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

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

你得到了

d1c6369b-73ce-498e-a2ef-2c6cea1d0f90

答案 3 :(得分:2)

我提出的替代方案是以下sed

sed -n 's/|\s*id\s*|\s*\(.*\S\)\s*|/\1/p' inputfile
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90

存储在变量

CINDER_ID=$(cinder create --image 3896b01c-6afb-41a4-a207-3db87527be2c \
--display-name centos7-cloud 30 | sed -n 's/|\s*id\s*|\s*\(.*[^\s]\)\s*|/\1/p' )

echo $CINDER_ID
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90

答案 4 :(得分:1)

鉴于列值被空格包围(在 |列分隔符中添加), awk的默认字段拆分行为将|个实例然后只计算为自己的字段):

cinder_ID=$(cinder create ... | awk '$2=="id" {print $4}')

您可以在块中添加; exit以立即停止处理;但是,对于如此小的输入集可能不值得。

请注意,我已将您的变量名称从CINDER_ID更改为cinder_ID,因为最好不要按顺序使用全大写的shell变量名称avoid conflicts with environment variables and special shell variables

答案 5 :(得分:1)

我认为你在这里不需要任何花哨的正则表达式匹配。创建具有某个名称的图像后,您可以发出此命令以获取图像ID。

# openstack image list -f value | grep '<Image name>' | awk '{print $1}'

你可以为音量做同样的事情。

# openstack volume list -f value | grep '<volumename>' | awk '{print $1}'