ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux中对文本分组统计排序

2021-01-24 12:34:14  阅读:239  来源: 互联网

标签:13 cut 05 00 Jan 分组 2021 Linux 排序


场景

有时候需要对一些日志进行分组统计排序,比如统计下nginx日志昨天的QPS是多少

原理

分析文本,取出目标信息,可以用cut,在进行分组统计,可以用awk,最后排序,可以用sort

实战

nginx access日志长下面这样

192.168.1.100 - - [13/Jan/2021:00:05:11 +0800] "POST /app/images/logo.png HTTP/1.1" 200 3430 "-" "Jakarta Commons-HttpClient/3.1" "-"   "0.106"   "0.106"  "192.168.1.105:8080"
192.168.1.100 - - [13/Jan/2021:00:05:11 +0800] "POST /app/images/logo.png HTTP/1.1" 200 3430 "-" "Jakarta Commons-HttpClient/3.1" "-"   "0.106"   "0.106"  "192.168.1.105:8080"

分析一下:要统计QPS,只要把时间13/Jan/2021:00:05:11取出来分组统计就可以了

取时间cut

用cut命令,-c20-39意思是从第23取到39,不知道具体是多少就要个测,前面最好加一个head -n 10表示取首10行,否则日志太大终端直接卡死

head -n 10 access_bak_2021-01-13.log| cut -c20-39

13/Jan/2021:00:05:11
13/Jan/2021:00:05:11
13/Jan/2021:00:05:11
13/Jan/2021:00:05:14
13/Jan/2021:00:05:14
13/Jan/2021:00:05:14
13/Jan/2021:00:05:15
13/Jan/2021:00:05:15
13/Jan/2021:00:05:15
13/Jan/2021:00:05:15

分组统计awk

a[$1]+=1表示对第一列而言,遇到一样的就加一个1,反正对于只有一列的分组统计来说直接加后面这一坨就对了:awk '{a[$1]+=1}END{for (i in a)print i,a[i]}'

head -n 10 access_bak_2021-01-13.log| cut -c20-39 | awk '{a[$1]+=1}END{for (i in a)print i,a[i]}'

13/Jan/2021:00:05:11 3
13/Jan/2021:00:05:14 3
13/Jan/2021:00:05:15 4

到这里其实统计效果已经出来了

排序sort

sort命令中

  • -n表示以数值计算,否则sort会认为2比10大,因为2比1大嘛,这是sort的一贯作风
  • -r表示逆序,不加表示顺序
  • -k2表示以第2列来排序
    当然你也可以写成-nrk2,所以最后就是下面这种效果
head -n 10 access_bak_2021-01-13.log| cut -c20-39 | awk '{a[$1]+=1}END{for (i in a)print i,a[i]}' | sort -n -r -k2

13/Jan/2021:00:05:15 4
13/Jan/2021:00:05:14 3
13/Jan/2021:00:05:11 3

后记

实际中可能是这样的,后面加个| more当数据太多的时候使用

cat access_bak_2021-01-13.log| cut -c20-39 | awk '{a[$1]+=1}END{for (i in a)print i,a[i]}' | sort -n -r -k2 | more

也可能是这样的,最前面加一个grep用于最基本的筛选,比如你的nginx中多个应用或者你仅仅想统计某个path的时候

grep 'app' access_bak_2021-01-13.log| cut -c20-39 | awk '{a[$1]+=1}END{for (i in a)print i,a[i]}' | sort -n -r -k2 | more

标签:13,cut,05,00,Jan,分组,2021,Linux,排序
来源: https://blog.csdn.net/xvktdmjg/article/details/113079091

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有