‘jq’中不区分大小写的检查是否相等

问题描述 投票:0回答:1

我在 govc govmomi github 页面上找到了以下内容,它允许我通过 MAC 地址搜索虚拟机:

govc object.collect -json -type m / config.hardware.device \
  | jq -r '
      .
      | select(.ChangeSet[].Val.VirtualDevice[].MacAddress == "00:50:56:bc:5e:3c")
      | [.Obj.Type, .Obj.Value]
      | join(":")
    ' \
  | xargs govc ls -L

请找到随附的 govc 输出片段,应该足够了:

{
  "Obj": {
    "Type": "VirtualMachine",
    "Value": "vm-666"
  },
  "ChangeSet": [
    {
      "Val": {
        "VirtualDevice": [
          {
          },
          {
            "MacAddress": "00:50:56:bc:5e:3c",
          }
        ]
      }
    }
  ]
}

我面临的问题是一些MAC包含大写字母,一些小写字母,我不提前知道哪台机器使用哪种方案。 我不知道如何使

==
不区分大小写。

我在 stackoverflow 上找到了建议使用

ascii_downcase
作为过滤器的答案,但我不知道如何应用
==

建议的欺骗语法给了我一系列

explode input must be a string
错误(govc 输出的每行 1 个)。

jq
1个回答
0
投票

建议的欺骗语法给了我一系列

explode input must be a string
错误(govc 输出的每行 1 个)。

这是因为您的其中一台设备没有

MacAddress
字段,并且
ascii_downcase
仅支持字符串,而不支持
null

要解决此问题,您可以使用

// ""
[doc link] 默认为空字符串,然后 then 将其传递给
ascii_downcase
:

govc object.collect -json -type m / config.hardware.device \
  | jq -r '
      .
      | select(.ChangeSet[].Val.VirtualDevice[].MacAddress // "" | ascii_downcase == "00:50:56:bc:5e:3c")
      | [.Obj.Type, .Obj.Value]
      | join(":")
    ' \
  | xargs govc ls -L
© www.soinside.com 2019 - 2024. All rights reserved.