如何使用jq将awk/grep输出的文本转换为指定结构的JSON
正确实现命令
你不需要额外调用awk做字段拆分,直接组合grep和jq即可输出符合要求的JSON,完整命令如下:
grep -n -r "text_to_match" * | jq -R -s ' split("\n") | map(select(length > 0)) | map( split(":") | { name: .[0], age: .[1] | tonumber } ) | {data: .} '
参数与逻辑说明
-R:按原始字符串格式读取输入,不做自动JSON解析-s:将所有输入内容读取为单个字符串,而非逐行独立处理,这是能把所有结果包裹进同一个数组的核心参数split("\n"):按换行符将整段输入拆分为行数组map(select(length > 0)):过滤输入末尾的空行,避免生成无效的空对象- 内层
split(":"):按冒号拆分每行内容,第一个元素赋值给name字段,第二个元素通过tonumber转为数字类型后赋值给age字段 - 最终将处理完成的对象数组挂载到
data字段下,输出符合要求的结构
如果你需要保留原有awk处理的中间步骤,可以使用以下兼容写法:
grep -n -r "text_to_match" * | awk -F '[:]' '{print $1,$2}' | jq -R -s ' split("\n") | map(select(length > 0)) | map( split(" ") | { name: .[0], age: .[1] | tonumber } ) | {data: .} '
原有命令的问题
- 未添加
-s参数:jq默认逐行处理输入,因此会输出多个独立的平面对象,无法组装到同一个data数组中 - 字段名不匹配:你之前定义的
file、start_line字段名和目标要求的name、age不一致 - 缺少类型转换:未对数字字段调用
tonumber做类型转换,输出的年龄值会是字符串格式,不符合预期
内容的提问来源于stack exchange,提问作者hscript
相关产品推荐
相关产品推荐

