实践一
最近需要对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命令还是十分强大的,有时候一次性的文件处理,可以优先考虑一下命令处理。
参考文章:
Linux命令行高效文件处理:去重、计数与排序实践
本文分享了如何利用Linux命令行工具对文件进行高效处理,包括对nginx日志进行统计,提取访问量top100的请求及其平均响应时长,以及在JVM调优中分析GC日志的平均YGC时长。通过`cut`、`sort`、`uniq`和`awk`等命令的组合使用,实现了对大量数据的便捷分析。
5865

被折叠的 条评论
为什么被折叠?



