Linux三剑客(awk-7)-awk项目实战(统计日志错误级别)

如何使用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 "============================================"

效果图

需要注意的:

  1. 如何精确得到汇总数据

输出分割符可以和正则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"}
  1. 如何统计重复次数

去重一般有两个命令: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)命令,便可得到重复次数。

  1. 如何去重空行

依旧使用awk 的正则pattern,在正则中\s代表的是空白,那[^\s]便是非空白,即我们要输出的行。

4. 如何统计一列的数据值

我们知道,shell中awk命令是逐行执行。那么实际上

awk命令

若一列中有4行,那么红框中的内容会执行4次。而非一次,本质上就是一个循环。我们我们便可以使用{sum+=$1},将每行的第一列汇总起来。

你可能感兴趣的:(Linux三剑客(awk-7)-awk项目实战(统计日志错误级别))