Shell环境使用jq处理日志转JSON报语法错误如何解决
问题根因
你遇到的是典型的jq表达式语法错误,从报错日志可以看到,jq实际解析到的表达式中,description:.[3]和timeWindow:.[4]两个键值对之间缺失了逗号,导致jq无法识别对象结构。
如果你的原始命令中已经写了逗号,那就是Shell引号传递问题:部分环境下单引号包裹的内容会被异常截断,导致逗号丢失。
修复方案
Linux/macOS 环境可直接运行命令
读取本地日志文件版本
cat 你的日志文件路径 | jq -R 'split("?") | { deviceName: .[0], ProcessId: (.[1] | tonumber), processName: .[2], description: .[3], timeWindow: .[4], numberOfOccurrence: (.[5] | tonumber) }'
从变量读取输入版本
echo "$input" | jq -R 'split("?") | { deviceName: .[0], ProcessId: (.[1] | tonumber), processName: .[2], description: .[3], timeWindow: .[4], numberOfOccurrence: (.[5] | tonumber) }'
可选优化说明
上面的命令额外加了tonumber转换,会把进程ID和发生次数字段从字符串转为数值类型,如果你需要保留字符串格式,去掉( | tonumber)部分即可。
Windows CMD 环境适配
如果是Windows cmd环境运行,需要把外层单引号换成双引号,内部双引号用反斜杠转义:
type 你的日志文件路径 | jq -R "split(\"?\") | { deviceName: .[0], ProcessId: .[1], processName: .[2], description: .[3], timeWindow: .[4], numberOfOccurrence: .[5] }"
运行效果示例
处理第一行日志后输出结果如下:
{ "deviceName": "BBAOMACBOOKAIR2", "ProcessId": 976, "processName": "AMPDeviceDiscoveryAgent[976]:", "description": " - Can't handle disconnect with invalid ecid", "timeWindow": "0700-0800", "numberOfOccurrence": 8 }
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

