利用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

这里先按第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
表示先以第二列排序后,再按照第一列排序

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


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我理解你的问题是如何对集合List根据多个字段进行复杂排序。一般来说,可以使用Java的Comparator接口来实现自定义排序。你可以定义一个新的类来实现Comparator接口,并覆盖其中的compare方法。在该方法中,可以按照需要对多个字段进行比较,从而实现复杂排序。具体实现可以参考以下示例代码: ``` import java.util.*; public class MultiFieldSorter implements Comparator<MyObject> { public int compare(MyObject a, MyObject b) { int result = a.getField1().compareTo(b.getField1()); // 利用字段1进行比较 if (result != 0) { return result; // 如果字段1不相同,直接返回比较结果 } result = a.getField2() - b.getField2(); // 利用字段2进行比较 if (result != 0) { return result; // 如果字段2不相同,直接返回比较结果 } result = a.getField3().compareTo(b.getField3()); // 利用字段3进行比较 return result; // 如果字段3也不相同,返回最终的比较结果 } } class MyObject { private String field1; private int field2; private String field3; public MyObject(String field1, int field2, String field3) { this.field1 = field1; this.field2 = field2; this.field3 = field3; } public String getField1() { return field1; } public int getField2() { return field2; } public String getField3() { return field3; } } class Test { public static void main(String[] args) { List<MyObject> list = new ArrayList<>(); list.add(new MyObject("a", 1, "c")); list.add(new MyObject("b", 2, "b")); list.add(new MyObject("c", 2, "a")); Collections.sort(list, new MultiFieldSorter()); // 使用自定义排序器进行排序 System.out.println(list); // 输出排序结果 } } ``` 在这个示例代码中,我们定义了一个MultiFieldSorter类来实现自定义排序。我们在compare方法中先按照字段1进行排序,如果字段1相同,则按照字段2进行排序,最后按照字段3进行排序。这样就可以实现根据多个字段进行复杂排序。 注意:上述代码只是示例,实际使用时需要根据具体需求来定义排序方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值