我正在使用以下脚本屏蔽敏感数据。对于yml文件效果很好。
awk '
BEGIN {
IGNORECASE = 1
}
$1 ~ /^('${3}')$/ {
gsub( /[^-]/, "X", $2 )
}
{ print }
' "${1}" > "${2}"
我从java类中将source_file dest_file maskKeyword传递为命令,如下所示,但它不起作用。
./script.sh /abc/aa.json /maskedaa.json ‘"password":’
这是我的json文件的样子。
[
{
"username": "abc",
"password": “cdgiN1n/nSQE="
},
{
"username": "abc",
"password": "QXiFTkgKft6PhfkfjLtCWQE="
}
]
答案 0 :(得分:3)
修复JSON(第4行的弯引号不正确,第9行的逗号不正确)之后,可以使用jq来完成
jq 'map(.password = "X")' aa.json
答案 1 :(得分:0)
我确实同意在这种情况下jq比awk更可取(下面有更多评论)。如果您知道JSON的印刷精美(每行只有一个条目),则可以使用正则表达式将行分成三部分。
awk -v field="${3}" '
BEGIN {
IGNORECASE = 1
regex = sprintf("^([^\"]*\"%s\"[^:]*:[^\"]*\")([^\"]*)(\".*)$", field)
}
$0 ~ regex {
before = gensub(regex, "\\1", 1)
password = gensub(regex, "\\2", 1)
after = gensub(regex, "\\3", 1)
masked = gensub(/./, "X", "g", password)
printf("%s%s%s\n", before, masked, after)
next
} { print }' "${1}" > "${2}"
我编写的awk脚本仅与漂亮的打印行的三个组成部分匹配:
[^\"]*\"%s\"[^:]*:[^\"]*\"
将输入行与分号匹配。字段名称必须在双引号之间。[^\"]*
:匹配条目的值\".*
:匹配该字段以及逗号和其他字段的结尾双引号。然后,该脚本会屏蔽密码,并用“ X”替换每个字符。最后,它将打印最终结果并跳过下一个块。
注意事项:
评论:如果必须具备可移植性,我会坚持使用jq解决方案,或者将jq烘焙到bash文件中。