Linux下对文件进行去重计数以及排序

实践一

最近需要对nginx日志文件进行统计,几十个文件,加起来上千万行的记录,用代码写就有点太那啥了,还占内存,所以决定使用linux命令来实现。

大概需求就是统计访问量top100的请求量,以及这100个请求的平均响应时长。

写出来对命令长这样:

cat nginx.log_2017-10-*.bak | awk -F '|' '{print $5}' | grep '?_' | awk -F '?' '{print $1}'| sort| uniq -c | sort -k 1 -nr | head -20

下面一一分析下上面对命令

  • awk -F '|' '{print ..}': 这个命令可以对一行数据进行格式化拆分,它本身支持非常灵活的内容处理,本身特性还可以进行编程,非常强大,这里只是把一行记录按‘|‘分开后输出第5部分的内容。
  • sort : 默认按默认排序是按照ASCII进行排序
  • uniq -c : 表示合并相邻的重复记录,并统计重复数。因为uniq -c 只会合并相邻的记录,所以在使用该命令之前需要先排序
  • sort -k 1 -nr : 经过uniq -c 处理之后的数据格式形如"2 data",第一个字段是数字,表示重复的记录数;第二个字段为记录的内容。我们将对此内容进行排序。sort -k 1表示对于每行的第一个字段进行排序,这里即指代表重复记录数的那个字段。因为sort命令的默认排序是按照ASCII,这就会导致按从大到小进行排序时,数值2会排在数值11的前面,所以需要使用-n 参数指定sort命令按照数值大小进行排序。-r 表示逆序,即按照从大到小的顺序进行排序
  • head -20 : 排完序,取前20行

实践二

某次调优JVM时,分析GC日志,其中使用CMS+UseParNewGC 回收器,产生的日志中要分析平均YGC的时长。
一行YGC日志长这样:

572.219: [GC (Allocation Failure) 572.219: [ParNew: 420082K->700K(471872K), 0.0081741 secs] 498361K->78979K(2044736K), 0.0082966 secs] [Times: user=0.02 sys=0.01, real=0.01 secs]

计算平均时长,我这里用了两条命令,一条求总数,一条求总时长

>> cat gc.log | grep 'Allocation' | awk -F ',' '{print $2}' | wc -l       # 总数
200
>> cat gc.log | grep 'Allocation' | awk -F ',' '{print $2}' | awk -F 'secs' '{a+=$1}END{print a}'   # 总时长
1.53131

在手动计算了一下平均值。其实也可以一行命令来计算平均值:

>> cat gc.log | grep 'Allocation' | awk -F ',' '{print $2}' | awk -F 'secs' '{a+=$1}END{print a/NR}'

linux命令还是十分强大的,有时候一次性的文件处理,可以优先考虑一下命令处理。

参考文章:

  1. linux sort,uniq,cut,wc命令详解
  2. awk if语句
  3. Linux下计算命令: 求和、求平均值、求最值

你可能感兴趣的:(Linux)