jq json parser hash 字段值

jq json parser hash the field value

我有一个 JSON 文件如下:

[{
  "macAddress": "ac:5f:3e:87:d7:1a",
  "ip": "1.2.3.4"
},
{
  "macAddress": "ac:5f:3e:87:d7:2a",
  "ip": "1.2.3.4"
},
{
  "macAddress": "ac:5f:3e:87:d7:3a",
  "ip": "1.2.3.4"
}]

使用 jq 散列 macAddress 字段,如下所示:

jq .[] | hash(.macAddress)

我可以定义自己的散列函数并在解析过程中让jq到运行散列吗?

我期望的哈希函数可以很简单,就像使用本机 linux 命令 md5sum

echo -n "my_salt""42:12:20:2e:2b:ca" | md5sum
d973ea7c353e78ba1724efbc8054dfdc -

所以输出 json 将是

[{
  "macAddress": "d973ea7c353e78ba1724efbc8054dfdc",
  "ip": "1.2.3.4"
},
{
  "macAddress": "d973ea7c353e78ba1724efbc8054d2er",
  "ip": "1.2.3.4"
},
{
  "macAddress": "d973ea7c353e78ba2324efbc8054d123",
  "ip": "1.2.3.4"
}]

My expected hash function can be simple as using native linux command md5sum

这保持原生并且可能合适;

调用:

jq -c .[] "$jsonfile" |
while read -r jsonline ; do
  hashmac="$(jq --arg mysalt "$mysalt" -s -j '
        .[] | "\($mysalt)" + .macAddress' <<<"$jsonline" |
      md5sum | cut -d ' ' -f1)"
  jq --arg hashmac "$hashmac" -s -r '
      .[] | .macAddress |= "\($hashmac)"' <<<"$jsonline"
done

示例文件 - /tmp/testfile:

[{
  "macAddress": "ac:5f:3e:87:d7:1a",
  "ip": "1.2.3.4"
},
{
  "macAddress": "ac:5f:3e:87:d7:2a",
  "ip": "1.2.3.4"
},
{
  "macAddress": "ac:5f:3e:87:d7:3a",
  "ip": "1.2.3.4"
},
{
 "macAddress": "42:12:20:2e:2b:ca",
 "ip": "1.2.3.4"
}]

结果输出:

{
  "macAddress": "1f960fe4d24684ca44e5e67b6259362c",
  "ip": "1.2.3.4"
}
{
  "macAddress": "3527422754ecbfdd01d48b17fce87842",
  "ip": "1.2.3.4"
}
{
  "macAddress": "9bc8da72324448c3032a20fb67a31466",
  "ip": "1.2.3.4"
}
{
  "macAddress": "d973ea7c353e78ba1724efbc8054dfdc",
  "ip": "1.2.3.4"
}

评论:

  • -j 导致 jq 不输出换行符,相当于您的 echo -n 示例

  • 此示例中的变量使用 -arg 作为字符串发送到 jq,并引用为 "\($var)" 而不是 直接转义变量,例如:

    • "\($mysalt)" + .macAddress'(jq变量)

      而不是:

    • "'"$mysalt"'" + .macAddress'(直接shell替换)

  • 此示例使用 cut -d ' ' -f1 到 trim 关闭 -,但可能有更好的方法

替补:

jq --arg hashmac "$hashmac" -s -r '.[] |= . + {"hashAddress":"\($hashmac)"}'

将附加 json

[
  {
    "macAddress": "ac:5f:3e:87:d7:1a",
    "ip": "1.2.3.4",
    "hashAddress": "1f960fe4d24684ca44e5e67b6259362c"
  }
]

等等

接受的答案需要 2n + 1 次 jq 调用,其中 n 是消息摘要函数的调用次数。

要将调用次数减少到 2 次,请参阅