利用sort对多字段排序

线上直播环境中需要从nginx访问日志中分析每个client在一个小时内的访问情况,需要使用sort对多重字段进行排序。

sort基础知识回顾

下面是需要用到的sort的知识点:

sort语法
[root@www ~]# sort [-fbMnrtuk] [file or stdin]
选项与参数:
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n :使用『纯数字』进行排序(默认是以文字型态来排序的);
-r :反向排序;
-u :就是 uniq ,相同的数据中,仅出现一行代表;
-t :分隔符,默认是用 [tab] 键来分隔;
-k :以那个区间 (field) 来进行排序的意思(其中,用来指明选定域的结束位置,默认到行尾)

其中我们需要知道-k这个选项。

我们先看一个简单的例子:

对使用冒号分隔的第三项(到末尾)进行排序(department_id),并去掉重复项

$ sort -t: -u -k 3 names.txt 
Emma Thomas:100:Marketing 
Madison Randy:300:Product Development 
Alex Jason:200:Sales 
Sanjay Gupta:400:Support

如果要对/etc/passwd,先以第六个域的第2个字符到第4个字符进行正向排序,再基于第一个域进行反向排序。
cat /etc/passwd | sort -t':' -k 6.2,6.4 -k 1r 
sync:x:4:65534:sync:/bin:/bin/sync
proxy:x:13:13:proxy:/bin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh

下面对指定字段的多重排序问题再做强调:

sort sort_demo.txt -k1,1 -k2n,2
利用sort对多字段排序_第1张图片
这里先按第2列排序,再按照第1列排序。注意, 这里按第一列排序应该写成-k1,1而不能是-k1
业务日志分析

下面是分析日志,检查那些response body响应时间过长的日志,排查client端网络较慢的原因:
zcat /usr/local/cloud/access_201609190000.tar.gz | grep -a "mltag=6003" | awk '$9>100000&&$10!=0&&$9/$10<400000{print $3,$2,$8,$9,$10,$9/$10,$(NF-6),$(NF-5),$(NF-4),$(NF-2),$(NF-1),$NF}' | column -t | sort -k2,2 -k1,1
表示先以第二列排序后,再按照第一列排序
利用sort对多字段排序_第2张图片

通过上面的多重排序输出,我们可以很清楚地分析某个client ip在一小时内所有请求的响应时间,如果都比较长,说明该client所在的网络环境不太好。


你可能感兴趣的:(Linux)