jq 转换文本字符串并将它们添加到现有的 json 对象中
jq to convert text strings and add them into an existing json object
如何转换文本字符串并将它们添加到现有的 json 对象中
当前json输出:
{
"start process": "Wed May 24 05:22:35 UTC 2017",
"logfilename": "log_test"
}
{
"start filelist": [
"/downloads/json_log_array2object.jq",
"/downloads/json_log_string2object.jq",
"/downloads/log_test.json",
"/downloads/log_test.txt",
"/downloads/test_logs.sh"
]
}
目标json输出:
{
"start process": "Wed May 24 05:22:35 UTC 2017",
"logfilename": "log_test",
"start filelist": [
"/downloads/json_log_array2object.jq",
"/downloads/json_log_string2object.jq",
"/downloads/log_test.json",
"/downloads/log_test.txt",
"/downloads/test_logs.sh"
]
}
bash 脚本:
logfilename="log_test"
writelogstring2object() {
exec 4>>".json"
flock -x 4
tee -a ".txt" | jq -sRf json_log_string2object.jq >&4
}
writelogarray2object() {
exec 4>>".json"
flock -x 4
tee -a ".txt" | jq -nRf json_log_array2object.jq >&4
}
exec 3> >(writelogstring2object "$logfilename")
{
echo "start process: $(date -u)"
echo "logfilename:" $logfilename
} >&3
exec 3>&-
flock -s "$logfilename.json" -c :
exec 3> >(writelogarray2object "$logfilename")
{
echo "start filelist:"
printf '%s\n' "$PWD"/*
} >&3
exec 3>&-
flock -s "$logfilename.json" -c :
jq 程序:
json_log_string2object.jq
def trim: sub("^ +";"") | sub(" +$";"");
def s2o:
(index(":") // empty) as $ix
| {(.[:$ix]): (.[$ix+1:]|trim)};
split("\n") | map(s2o) | add
json_log_array2object.jq
foreach (inputs,null) as $line ({};
if $line == null then .emit = {(.key|tostring): .value}
elif $line[-1:] == ":"
then (if .key then {emit: {(.key): .value}} else null end)
+ { key : $line[0:-1] }
else {key, value: (.value + [$line])}
end;
.emit // empty )
欣赏方法和示例
要添加两个 JSON 对象,$one 和 $two,您可以写 $one + $two
.
问题描述开头给出的两个对象并不像JSON那样有效。假设文件 input.json 包含更正后的文本,调用:
jq -s '.[0] + .[1]' input.json
得到想要的答案。
如何转换文本字符串并将它们添加到现有的 json 对象中
当前json输出:
{
"start process": "Wed May 24 05:22:35 UTC 2017",
"logfilename": "log_test"
}
{
"start filelist": [
"/downloads/json_log_array2object.jq",
"/downloads/json_log_string2object.jq",
"/downloads/log_test.json",
"/downloads/log_test.txt",
"/downloads/test_logs.sh"
]
}
目标json输出:
{
"start process": "Wed May 24 05:22:35 UTC 2017",
"logfilename": "log_test",
"start filelist": [
"/downloads/json_log_array2object.jq",
"/downloads/json_log_string2object.jq",
"/downloads/log_test.json",
"/downloads/log_test.txt",
"/downloads/test_logs.sh"
]
}
bash 脚本:
logfilename="log_test"
writelogstring2object() {
exec 4>>".json"
flock -x 4
tee -a ".txt" | jq -sRf json_log_string2object.jq >&4
}
writelogarray2object() {
exec 4>>".json"
flock -x 4
tee -a ".txt" | jq -nRf json_log_array2object.jq >&4
}
exec 3> >(writelogstring2object "$logfilename")
{
echo "start process: $(date -u)"
echo "logfilename:" $logfilename
} >&3
exec 3>&-
flock -s "$logfilename.json" -c :
exec 3> >(writelogarray2object "$logfilename")
{
echo "start filelist:"
printf '%s\n' "$PWD"/*
} >&3
exec 3>&-
flock -s "$logfilename.json" -c :
jq 程序:
json_log_string2object.jq
def trim: sub("^ +";"") | sub(" +$";"");
def s2o:
(index(":") // empty) as $ix
| {(.[:$ix]): (.[$ix+1:]|trim)};
split("\n") | map(s2o) | add
json_log_array2object.jq
foreach (inputs,null) as $line ({};
if $line == null then .emit = {(.key|tostring): .value}
elif $line[-1:] == ":"
then (if .key then {emit: {(.key): .value}} else null end)
+ { key : $line[0:-1] }
else {key, value: (.value + [$line])}
end;
.emit // empty )
欣赏方法和示例
要添加两个 JSON 对象,$one 和 $two,您可以写
$one + $two
.问题描述开头给出的两个对象并不像JSON那样有效。假设文件 input.json 包含更正后的文本,调用:
jq -s '.[0] + .[1]' input.json
得到想要的答案。