在 shell 脚本中从 Openstack 创建命令的输出中获取 `id` 字段
Get `id` field from output of Openstack creation commands in shell script
OpenStack 命令(例如 cinder create
、nova boot
、glance image-create
)输出有关新 volume/instance/image.
的 table 详细信息
$ 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
提取到变量的最佳方法是什么?
使用 GNU awk's
、gensub-function,您可以执行如下操作。以下逻辑中的函数通过 |
从第 2,3 field-separated 列中删除前导和尾随空格
(通过将 table 写入文件进行检查)
awk -F"|" 'gensub(/^[ \t]+|[ \t]+$/,"","g",)=="id"{print gensub(/^[ \t]+|[ \t]+$/,"","g",);}' file
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90
将其存储在变量中,
idValue="$(awk -F"|" 'gensub(/^[ \t]+|[ \t]+$/,"","g",)=="id"{print gensub(/^[ \t]+|[ \t]+$/,"","g",);}' file)"
printf "%s\n" "$idValue"
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90
您可以通过管道将生成上述 table 的命令传递给此 Awk
as
<your-command> | awk '{..}'
有点像,
cinder create --image 3896b01c-6afb-41a4-a207-3db87527be2c --display-name centos7-cloud 30 \
| awk -F"|" 'gensub(/^[ \t]+|[ \t]+$/,"","g",)=="id"{print gensub(/^[ \t]+|[ \t]+$/,"","g",);}'
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90
以下解决方案使用支持环顾四周的 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.*[^\|]+' )
您可以使用 \s*\|\s*
作为字段分隔符
CINDER_ID=$(cinder create --image 3896b01c-6afb-41a4-a207-3db87527be2c --display-name centos7-cloud 30 |
awk 'BEGIN{FS="\s*\|\s*"}=="id"{print }')
echo $CINDER_ID
你得到
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90
我想到的替代方案如下 sed
sed -n 's/|\s*id\s*|\s*\(.*\S\)\s*|//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*|//p' )
echo $CINDER_ID
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90
鉴于列值被空格包围(除了 |
列分隔符),awk
默认 field-splitting 行为会执行 (|
实例本身就可以简单地算作字段):
cinder_ID=$(cinder create ... | awk '=="id" {print }')
您可以在块内附加 ; exit
以立即停止处理;然而,对于这么小的输入集来说可能不值得。
请注意,我已将您的变量名称从 CINDER_ID
更改为 cinder_ID
,因为 最好不要使用 all-uppercase shell-variable 名称 为了 avoid conflicts with environment variables and special shell variables.
我认为您在这里不需要任何花哨的正则表达式匹配。使用某个名称创建图像后,您可以发出此命令以获取图像 ID。
# openstack image list -f value | grep '<Image name>' | awk '{print }'
您可以对音量执行相同的操作。
# openstack volume list -f value | grep '<volumename>' | awk '{print }'
OpenStack 命令(例如 cinder create
、nova boot
、glance image-create
)输出有关新 volume/instance/image.
$ 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
提取到变量的最佳方法是什么?
使用 GNU awk's
、gensub-function,您可以执行如下操作。以下逻辑中的函数通过 |
(通过将 table 写入文件进行检查)
awk -F"|" 'gensub(/^[ \t]+|[ \t]+$/,"","g",)=="id"{print gensub(/^[ \t]+|[ \t]+$/,"","g",);}' file
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90
将其存储在变量中,
idValue="$(awk -F"|" 'gensub(/^[ \t]+|[ \t]+$/,"","g",)=="id"{print gensub(/^[ \t]+|[ \t]+$/,"","g",);}' file)"
printf "%s\n" "$idValue"
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90
您可以通过管道将生成上述 table 的命令传递给此 Awk
as
<your-command> | awk '{..}'
有点像,
cinder create --image 3896b01c-6afb-41a4-a207-3db87527be2c --display-name centos7-cloud 30 \
| awk -F"|" 'gensub(/^[ \t]+|[ \t]+$/,"","g",)=="id"{print gensub(/^[ \t]+|[ \t]+$/,"","g",);}'
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90
以下解决方案使用支持环顾四周的 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.*[^\|]+' )
您可以使用 \s*\|\s*
作为字段分隔符
CINDER_ID=$(cinder create --image 3896b01c-6afb-41a4-a207-3db87527be2c --display-name centos7-cloud 30 |
awk 'BEGIN{FS="\s*\|\s*"}=="id"{print }')
echo $CINDER_ID
你得到
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90
我想到的替代方案如下 sed
sed -n 's/|\s*id\s*|\s*\(.*\S\)\s*|//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*|//p' )
echo $CINDER_ID
d1c6369b-73ce-498e-a2ef-2c6cea1d0f90
鉴于列值被空格包围(除了 |
列分隔符),awk
默认 field-splitting 行为会执行 (|
实例本身就可以简单地算作字段):
cinder_ID=$(cinder create ... | awk '=="id" {print }')
您可以在块内附加 ; exit
以立即停止处理;然而,对于这么小的输入集来说可能不值得。
请注意,我已将您的变量名称从 CINDER_ID
更改为 cinder_ID
,因为 最好不要使用 all-uppercase shell-variable 名称 为了 avoid conflicts with environment variables and special shell variables.
我认为您在这里不需要任何花哨的正则表达式匹配。使用某个名称创建图像后,您可以发出此命令以获取图像 ID。
# openstack image list -f value | grep '<Image name>' | awk '{print }'
您可以对音量执行相同的操作。
# openstack volume list -f value | grep '<volumename>' | awk '{print }'