如何用jq分离混合JSON与非JSON格式的日志文件?
混合日志拆分方案
命令实现
使用tee结合jq实现日志分流,以下命令可准确将混合日志拆分为纯JSON日志与纯非JSON日志:
cat "$logfile" | tee >(jq -R 'fromjson? | select(type == "object")' > "$json_log_file") >(jq -R 'select(fromjson? | type != "object")' > "$plain_log_file") > /dev/null
命令说明
tee >(...) >(...):将输入日志同时分发到两个jq处理进程- 第一个
jq分支(提取JSON日志):-R:以原始字符串格式读取每行日志fromjson?:尝试将字符串解析为JSON,解析失败则返回nullselect(type == "object"):仅保留解析成功的JSON对象行,写入JSON日志文件
- 第二个
jq分支(提取非JSON日志):select(fromjson? | type != "object"):筛选出无法解析为JSON对象的行(包括非JSON文本、解析为字符串/数字等非对象的JSON值),保留原始内容写入纯文本日志文件
> /dev/null:避免原始日志内容输出到终端
注意事项
- 需确保
jq版本≥1.5,fromjson?语法在该版本及以上支持 - 若日志包含多行JSON(单条日志跨多行),上述命令无法正确处理,需额外结合
jq --slurp或其他工具预处理 - 拆分后的文件可直接用lnav打开查看:
lnav "$json_log_file"或lnav "$plain_log_file"
内容的提问来源于stack exchange,提问作者tonywl
相关产品推荐
相关产品推荐

