【问题标题】:UNIX get 5 minutes ago transaction from JSON SED/AWKUNIX 从 JSON SED/AWK 获取 5 分钟前的事务
【发布时间】:2021-02-12 23:37:32
【问题描述】:

我的应用程序中有这个特定的日志

{"timestamp":"2020-10-30T20:30:29.722+08:00","status_category":"SUCCESS","status_name":"SUCCESS","delta":36,"sub_calls":[{"operation":"serviceDao.searchDealerByDealerCode","start":1604061029722,"stop":1604061029733,"delta":11},
{"timestamp":"2020-10-30T20:30:29.978+08:00","status_category":"SUCCESS","status_name":"SUCCESS","delta":44,"sub_calls":[{"operation":"serviceDao.searchDealerByDealerCode","start":1604061029978,"stop":1604061029979,"delta":1},
{"timestamp":"2020-10-30T20:30:30.327+08:00","status_category":"SUCCESS","status_name":"SUCCESS","delta":25,"sub_calls":[{"operation":"serviceDao.searchDealerByDealerCode","start":1604061030327,"stop":1604061030328,"delta":1},
{"timestamp":"2020-10-30T20:30:30.397+08:00","status_category":"SUCCESS","status_name":"SUCCESS","delta":51,"sub_calls":[{"operation":"serviceDao.searchDealerByDealerCode","start":1604061030397,"stop":1604061030398,"delta":1},
{"timestamp":"2020-10-30T20:30:30.531+08:00","status_category":"SUCCESS","status_name":"SUCCESS","delta":58,"sub_calls":[{"operation":"serviceDao.searchDealerByDealerCode","start":1604061030531,"stop":1604061030532,"delta":1},
{"timestamp":"2020-10-30T20:30:30.721+08:00","status_category":"SUCCESS","status_name":"SUCCESS","delta":45,"sub_calls":[{"operation":"serviceDao.searchDealerByDealerCode","start":1604061030721,"stop":1604061030722,"delta":1},

目的是提取前5分钟的日志,获取成功次数和失败次数 也许期望输出像

Success: 5
Failure : 5

我已经有了前 5 分钟的食谱

awk -v d1="$(date --date="-5 min" "+%Y-%m-%dT%H:%M:%S.%3N+08:00")" -v d2="$(date "+%Y-%m-%dT%H:%M:%S.%3N+08:00")" '$0 > d1 && $0 < d2 || $0 ~ d2'  /infile/2020103020.jsn

但现在的挑战是我很难使用 grep 提取 json。

我什至尝试过

sed -E 's/\},\s*\{/\},\n\{/g' /infile/2020103020.jsn | grep  '"timestamp":^C

grep -Po '"timestamp":"\K[^"]*' /infile/2020103020.jsn"

我需要一些启发

【问题讨论】:

  • 您正在使用正则表达式来解析 JSON 数据,应该使用 JSON 解析器更好地处理。

标签: regex unix awk sed grep


【解决方案1】:

这将为您提供状态和时间戳:

sed -n 's/.*"timestamp":"\([^"]*\)".*"status_category":"\([^"]*\)".*/\1 \2/p' /infile/2020103020.jsn

输出

2020-10-30T20:30:29.722+08:00 SUCCESS
2020-10-30T20:30:29.978+08:00 SUCCESS
2020-10-30T20:30:30.327+08:00 SUCCESS
2020-10-30T20:30:30.397+08:00 SUCCESS
2020-10-30T20:30:30.531+08:00 SUCCESS
2020-10-30T20:30:30.721+08:00 SUCCESS
2020-10-30T20:30:30.721+08:00 SUCCESS

也许您可以考虑一些近似值,例如读取文件的最后 100 行并忽略时间戳:

tail -100 /infile/2020103020.jsn | \
   sed -n 's/.*"status_category":"\([^"]*\)".*/\1/p'| \
   sort | uniq -c

【讨论】:

    猜你喜欢
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 2013-06-15
    相关资源
    最近更新 更多