如何使用shell命令获取JSON串中的日志级别。进行统计呢?
2019-07-05 13:52:23,505 [XX接口] [C201907051352239314] : {"code":"2202","createDate":"2019-07-05 13:52:23","excType":"validateException","level":"warn","merchId":"AB20171101188709","msg":"系统异常","orderId":"T9292019070513****542","serviceId":"XXserviceId","serviceName":"XX接口","type":"user"}
按照错误码的划分,可以将日志级别划分为informal [正常级别]、 warn [警告级别] 、error[错误级别]、fatal[致命级别]。
但是数据是保存到JSON串中的,如何在JSON串中将数据取出来,并且进行汇总、排序、打印呢?
#!/bin/sh
fileName=$1
level=$2
echo "============================================"
echo "[获取异常信息]-[参数准备]-[文件名]-[$fileName]"
echo "[获取异常信息]-[参数准备]-[异常等级]-[$level]"
echo "============================================"
if [ -z "$fileName" ];then
echo "[参数fileName为空]-[默认使用client-api-error.log]"
fileName="client-api-error.log"
fi
echo "[获取异常信息]-[异常汇总]-[开始]"
awk -F '("level":"|","merchId")' '{print $2}' ../log/$fileName | awk '/[^\s]$/{print $0}' | sort | uniq -c | sort -nr |
awk 'BEGIN{printf "%s\n%s\n","异常类型统计-[开始]","[异常级别]-[数量]"}
{sum+=$1}
{printf "[%-8s]-[%-4s]\n",$2,$1}
END{ {printf "%s%s%s\n","[异常汇总]-[共统计异常",sum,"条]"}}'
echo "[获取异常信息]-[异常汇总]-[结束]"
echo "============================================"
if [ -n "$level" ];then
awk -v level=$level '/'$level'/{print $0}' ../log/$fileName >$level'.log'
echo "[异常信息输出]-[错误日志已输出到 "$level".log文件中]"
else
echo "[无异常信息输出]"
fi
echo "============================================"
需要注意的:
- 如何精确得到汇总数据
输出分割符可以和正则Pattern可以混合使用,进行精确切分。
awk -F '("level":"|","merchId")' '{print $2}'
实际上将日志切分成3段:
2019-07-05 13:52:23,505 [XX接口] [C201907051352239314] : {"code":"2202","createDate":"2019-07-05 13:52:23","excType":"validateException","level":"
level
","merchId":"AB20171101188709","msg":"系统异常","orderId":"T9292019070513****542","serviceId":"XXserviceId","serviceName":"XX接口","type":"user"}
- 如何统计重复次数
去重一般有两个命令:sort -u(niq)和uniq,但实际上使用uniq之前,也要进行一次sort命令。
$ awk -F '("level":"|","merchId")' '{print $2}' client-api-error.log |sort|uniq -c
8
1 error
2 fatal
12 informal
2 warn
使用-uniq -c(ount)命令,便可得到重复次数。
- 如何去重空行
依旧使用awk 的正则pattern,在正则中\s代表的是空白,那[^\s]便是非空白,即我们要输出的行。
4. 如何统计一列的数据值
我们知道,shell中awk命令是逐行执行。那么实际上
若一列中有4行,那么红框中的内容会执行4次。而非一次,本质上就是一个循环。我们我们便可以使用{sum+=$1},将每行的第一列汇总起来。