Json Bash/JQ解析错误:第1行第254列的值之间需要分隔符
我得到一个解析错误:在执行函数时 这与jq或bash错误有关吗Json Bash/JQ解析错误:第1行第254列的值之间需要分隔符,json,bash,runtime-error,jq,Json,Bash,Runtime Error,Jq,我得到一个解析错误:在执行函数时 这与jq或bash错误有关吗 generate_readable_output() { mkdir -p smoke-test-logs/tmp counter=1 error_length=`jq length smoke-test-logs/error-log.json` echo "[" > smoke-test-logs/tmp/filds-output jq -c '.[]' smoke-test-logs
generate_readable_output() {
mkdir -p smoke-test-logs/tmp
counter=1
error_length=`jq length smoke-test-logs/error-log.json`
echo "[" > smoke-test-logs/tmp/filds-output
jq -c '.[]' smoke-test-logs/error-log.json | while read i; do
msg=$(echo $i | jq -r '.msg')
type=$(echo $i | jq -r '.name')
echo "{\"title\": \"$type\",\"value\": \"$msg\",\"short\": false}," >> smoke-test-logs/tmp/filds-output;
if [ $counter -eq 20 ]
then
break
fi ;
counter=$(expr $counter + 1)
done
if [ $error_length -gt 20 ]
then echo "{\"title\": \"There are more...\",\"value\": \"There are $error_length issues need to take necessary actions immediately.\",\"short\": false}," >> smoke-test-logs/tmp/filds-output
fi ;
echo $(sed '$ s/.$//' smoke-test-logs/tmp/filds-output) > smoke-test-logs/tmp/filds-output
echo "]" >> smoke-test-logs/tmp/filds-output
}
示例error-log.json内容
filds输出内容
错误输出
您的数据源是一个格式良好的JSON文档,在这个级别上没有问题 当您读取jq命令输出的每一行时,就会出现问题。由于存在转义字符,read命令将解释并删除它们。然后,稍后在循环中,对JQ的后续调用将考虑有未转义字符。 因此,我修改您的脚本以考虑以下两点:
generate_readable_output() {
mkdir -p smoke-test-logs/tmp
local counter=1
local error_length=$(jq length smoke-test-logs/error-log.json)
echo "[" > smoke-test-logs/tmp/filds-output
jq -c '.[]' smoke-test-logs/error-log.json | while read -r i
do
local msg=$(echo $i | jq '.msg')
local type=$(echo $i | jq '.name')
echo "{\"title\": $type,\"value\": $msg,\"short\": false}," >> smoke-test-logs/tmp/filds-output
if [ $counter -eq 20 ]
then
break
fi
counter=$(expr $counter + 1)
done
if [ $error_length -gt 20 ]
then
echo "{\"title\": \"There are more...\",\"value\": \"There are $error_length issues need to take necessary actions immediately.\",\"short\": false}," >> smoke-test-logs/tmp/filds-output
fi
echo $(sed '$ s/.$//' smoke-test-logs/tmp/filds-output) > smoke-test-logs/tmp/filds-output
echo "]" >> smoke-test-logs/tmp/filds-output
}
您可以看到,通过thr-r标志调用read以:
-r不允许反斜杠转义任何字符
[ {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "","value": "","short": false}, {"title": "There are more...","value": "There are 348 issues need to take necessary actions immediately.","short": false}
]
parse error: Expected separator between values at line 1, column 254
parse error: Expected separator between values at line 1, column 254
parse error: Expected separator between values at line 1, column 245
parse error: Expected separator between values at line 1, column 245
generate_readable_output() {
mkdir -p smoke-test-logs/tmp
local counter=1
local error_length=$(jq length smoke-test-logs/error-log.json)
echo "[" > smoke-test-logs/tmp/filds-output
jq -c '.[]' smoke-test-logs/error-log.json | while read -r i
do
local msg=$(echo $i | jq '.msg')
local type=$(echo $i | jq '.name')
echo "{\"title\": $type,\"value\": $msg,\"short\": false}," >> smoke-test-logs/tmp/filds-output
if [ $counter -eq 20 ]
then
break
fi
counter=$(expr $counter + 1)
done
if [ $error_length -gt 20 ]
then
echo "{\"title\": \"There are more...\",\"value\": \"There are $error_length issues need to take necessary actions immediately.\",\"short\": false}," >> smoke-test-logs/tmp/filds-output
fi
echo $(sed '$ s/.$//' smoke-test-logs/tmp/filds-output) > smoke-test-logs/tmp/filds-output
echo "]" >> smoke-test-logs/tmp/filds-output
}