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 次,请参阅
我有一个 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 次,请参阅