求助:修复Shell脚本实现Checkmarx扫描结果转JSON格式
问题:将Checkmarx扫描结果文本转换为JSON格式
原始输入文本(存储在Checkmarx_Json_Data.txt)
High Severity Results: 0 Medium Severity Results: 1 Low Severity Results: 2 Information Severity Results: 0 Scan Results Location: Https://www.checkmarx.abc.com/cxwebclient/viewermain.aspx?scanid=12345&projectid=1234
期望输出的JSON格式
{ "High Severity Results" : "0", "Medium Severity Results" : "1", "Low Severity Results" : "2", "Information Severity Results" : "0", "Scan Results Location" : "Https://www.checkmarx.abc.com/cxwebclient/viewermain.aspx?scanid=12345&projectid=1234" }
错误的尝试脚本
用户尝试的Shell脚本因逻辑问题生成了错误的JSON:
file="Checkmarx_Json_Data.txt" checkmarxDataNew="$(cat Checkmarx_Json_Data.txt)" while IFS= read -r line || [[ -n "$line" ]]; do for val in $line do echo "\"${val//:/\" : \"}\"" >> ACM_BQ_JSON_Response.json done done < "$file"
错误输出
脚本将每行按空格拆分,导致键名被拆分为单个单词,且URL中的冒号被错误替换:
"checkmarx" : { "High" "Severity" "Results":"" "0" "Medium" "Severity" "Results":"" "1" "Low" "Severity" "Results":"" "2" "Information" "Severity" "Results":"" "0" "Scan" "Results" "Location":"" "Https":"//www.checkmarx.ford.com/cxwebclient/viewermain.aspx?scanid=2500093&projectid=28069" }
错误原因分析
for val in $line会默认按空格拆分每行内容,破坏了包含空格的键名(如High Severity Results)。- 直接替换所有冒号的逻辑错误,导致URL中的
https://冒号被错误转换为键值对。
修复后的解决方案
方案1:使用awk(简洁高效)
awk可以方便地按指定分隔符分割每行,保留键名中的空格:
# 清空目标文件 > ACM_BQ_JSON_Response.json # 写入JSON开头 echo "{" >> ACM_BQ_JSON_Response.json # 处理每行,按": "分割键和值,生成JSON格式行 awk -F': ' '{printf "\"%s\" : \"%s\",\n", $1, $2}' Checkmarx_Json_Data.txt >> ACM_BQ_JSON_Response.json # 移除最后一行的末尾逗号(避免JSON格式错误) sed -i '$ s/,$//' ACM_BQ_JSON_Response.json # 写入JSON结尾 echo "}" >> ACM_BQ_JSON_Response.json
方案2:纯Shell实现(无需awk依赖)
通过字符串分割提取键和值:
> ACM_BQ_JSON_Response.json echo "{" >> ACM_BQ_JSON_Response.json while IFS= read -r line; do # 定位第一个冒号的位置 colon_pos=$(expr index "$line" ':') # 提取完整键名(冒号前的内容) key="${line:0:colon_pos-1}" # 提取值(冒号后跳过空格的内容) value="${line:colon_pos+1}" # 写入JSON行 echo "\"$key\" : \"$value\"," >> ACM_BQ_JSON_Response.json done < Checkmarx_Json_Data.txt # 移除最后一行的逗号 sed -i '$ s/,$//' ACM_BQ_JSON_Response.json echo "}" >> ACM_BQ_JSON_Response.json
内容的提问来源于stack exchange,提问作者Karthik Peddineni
相关产品推荐
相关产品推荐

