如何获取Azure中处于运行状态且特定标签不存在的虚拟机ID
Azure CLI多条件过滤VM ID解决方案
你可以通过以下两种可行方法解决引号冲突问题:
方法1:Bash单引号嵌套转义
Bash单引号字符串内部如果需要插入单引号,使用'\''结构转义即可,既可以保证外层用单引号包裹整个查询避免!触发event not found错误,也可以让JMESPath正常识别单引号包裹的VM running匹配值。
有效命令如下:
az vm list -d --query '[?!not_null(tags.run)] | [?powerState=='\''VM running'\''].id'
转义逻辑:'\''结构中,第一个'关闭外层单引号,\'声明一个转义的单引号字符,最后一个'重新开启外层单引号,最终JMESPath收到的查询语句完全符合语法要求。
方法2:双引号包裹查询+转义!符号
你也可以选择用双引号包裹整个查询,仅对触发bash历史事件匹配的!符号做转义即可,内部的单引号可以直接使用无需额外处理:
az vm list -d --query "[?\!not_null(tags.run)] | [?powerState=='VM running'].id"
扩展:一次性查询所有订阅下符合条件的VM
如果需要覆盖所有订阅的查询需求,可以搭配遍历所有Azure订阅的逻辑实现:
az account list --query [].id -o tsv | while read sub_id; do az vm list -d --subscription $sub_id --query '[?!not_null(tags.run)] | [?powerState=='\''VM running'\''].id' -o tsv done
内容的提问来源于stack exchange,提问作者Akshar Athreya
相关产品推荐
相关产品推荐

