如何用SED/AWK提取5分钟内JSON日志并统计成功失败次数
解决JSON日志的最近5分钟成功/失败统计问题
嘿,我懂你现在卡在怎么从JSON日志里精准提取状态并统计的问题上了——之前用grep/sed尝试没搞定太正常了,毕竟JSON的结构用正则处理很容易踩坑。给你推荐个更靠谱的方案,用专门处理JSON的工具jq来搞定,比awk/grep组合好用太多!
核心思路
你的日志大概率是JSON数组格式(一堆日志对象包在[]里),或者每行一个独立JSON对象。不管哪种格式,jq都能精准解析timestamp和status字段,结合时间筛选后直接统计次数。
具体步骤
1. 生成时间范围变量
先拿到5分钟前的ISO格式时间戳(和你日志里的timestamp格式完全匹配):
start_time=$(date --date="-5 min" "+%Y-%m-%dT%H:%M:%S.%3N+08:00")
2. 用jq+awk完成筛选与统计(新手友好版)
如果日志是JSON数组格式(比如[{"timestamp":"...","status":"success"},...]):
jq -r --arg start "$start_time" ' .[] | select(.timestamp >= $start) | .status' /infile/2020103020.jsn | awk '{ if ($0 == "success") success++ else if ($0 == "failure") failure++ } END { print "Success: " success " Failure : " failure }'
如果日志是每行一个JSON对象:
jq -r --arg start "$start_time" ' select(.timestamp >= $start) | .status' /infile/2020103020.jsn | awk '{ if ($0 == "success") success++ else if ($0 == "failure") failure++ } END { print "Success: " success " Failure : " failure }'
3. 全程用jq搞定(更简洁版)
不想额外用awk的话,直接用jq的reduce功能完成统计:
jq --arg start "$start_time" ' reduce .[] as $item ( {"success":0, "failure":0}; if $item.timestamp >= $start then if $item.status == "success" then .success +=1 elif $item.status == "failure" then .failure +=1 else . end else . end ) | "Success: \(.success) Failure : \(.failure)"' /infile/2020103020.jsn
为啥之前的grep/sed不好用?
JSON的结构允许换行、空格随意变化,比如一个日志对象可能跨多行,或者timestamp字段前后有不同的空格,用正则提取很容易漏抓或者误抓。而jq是专门解析JSON的工具,能完全识别JSON的结构,不管格式怎么变都能精准提取字段,避免正则的各种坑。
内容的提问来源于stack exchange,提问作者Jeeva Suriyaa
相关产品推荐
相关产品推荐

