【问题标题】:jq json parser hash the field valuejq json解析器散列字段值
【发布时间】:2016-08-03 09:28:57
【问题描述】:

我有一个如下的 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"
}]

【问题讨论】:

  • 您希望输出是什么:a) 哈希 MAC 地址列表,由换行符分隔,或 b) 像输入一样的 JSON 对象,只是将 MAC 地址替换为其哈希值, 或 c) 别的什么?请在问题中提供示例输出。
  • @HansZ。我已根据您的要求更新了要求。

标签: parsing hash jq


【解决方案1】:

我期望的哈希函数可以很简单,就像使用原生 linux 命令 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'(直接外壳替换)

  • 此示例使用cut -d ' ' -f1 修剪-,但可能有更好的方法

备用:

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

会附加 json

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

等等

【讨论】:

    【解决方案2】:

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

    要将调用次数减少到仅 2 次,请参阅 shell-out value to md5 (crypto) function

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-01
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      相关资源
      最近更新 更多