用实例来说明linux命令sort的用法
sort常用参数的介绍就省略了,直接man sort就OK了......
这里主要通过实际问题来介绍(通常用于分析日志)
先介绍2个选项:
1.-k选项指定排序字段的使用:-k[FStart[.CStart]][Modifier][,[FEnd[.CEnd]][Modifier]]
排序关键字包括所有以FStart变量指定的字段和CStart变量指定的列开头的及以FEnd变量指定的字段和CEnd变量指定的列结束的字符,缺省值为:FStart行开头,CStart字段第一列,FEnd行结束,CEnd字段最后一列
例如:-k3.2,4.4 指从第3个字段的第2个字符开始比较,一直比到第4个字段的第4个字符
2.-t选项选择字段分隔符
测试数据如下:
# cat data
apple:234
apple:623
banana:234
apple:72
apple:123
pear:9
banana:92
一.以":"作为分隔符,对第一列进行升序排序
# sort -t ':' -k1,1 data
apple:123
apple:234
apple:623
apple:72
banana:234
banana:92
pear:9
注:默认是升序排序,貌似在对第一列排序的基础上也对第二列进行了排序,等价于# sort -t ':' -k1 data
二.以":"作为分隔符,先对第一列进行升序排序,而对第二列进行降序排序(以整数类型进行比较)
# sort -t ':' -k1,1 -k2,2nr data
apple:623
apple:234
apple:123
apple:72
banana:234
banana:92
pear:9
三.以":"作为分隔符,对第一列进行升序排序,并对第一列进行去重
# sort -t ':' -k1,1 -u data
apple:234
banana:234
pear:9
注:通过与cat data的结果进行对比可知:默认是在第一列相同的所有行中仅保留未排序状态下的第一行
四.以":"作为分隔符,对第一列进行升序排序,并对第一列进行去重,去重的规则是在第一列相同的所有行中保留第二列值最大的行
# sort -t ':' -k1,1 -k 2,2nr data | sort -t ':' -k1,1 -u
apple:623
banana:234
pear:9
其实也可以使用awk:# sort -t ':' -k1,1 -k 2,2nr data | awk 'BEGIN{FS=":"} !a[$1]++',注意这里需要使用BEGIN,明白awk的处理过程后不难理解这里为何要加上BEGIN
五.先排序,然后以":"作为分隔符对第一列去重后并统计,并按照统计的计数进行排序
# sort -t ':' -k1,1 data | awk 'BEGIN{FS=":"} {print $1}' | uniq -c | sort -n
1 pear
2 banana
4 apple