You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 17:58:13