Linux sort命令的注意点

正常情况

  • 测试数据
[root@centos7-18 test]# ls 
1  10  2  3  4  5  6  7  8  9  a  b  c  d  test2

可以看到,以字典序排序,字母比数字的值要大

  • 使用sort -n进行按照数值排序
[root@centos7-18 test]# ls |sort -n
a
b
c
d
test2
1
2
3
4
5
6
7
8
9
10

可以看到,以数值排序,数字比字母的值要大

  • 按照数值排序之后,再逆序
[root@centos7-18 test]# 
[root@centos7-18 test]# ls |sort -nr
10
9
8
7
6
5
4
3
2
1
test2
d
c
b
a

结果正常

特殊情况

  • 构造数据
[root@centos7-18 test2]# touch database-2019-06-01_0300.tar.gz    database-2019-04-01_0300.tar.gz    database-2019-04-15_0300.tar.gz    database-2019-05-01_0300.tar.gz    database-2019-05-15_0300.tar.gz    database-2019-08-15_0300.tar.gz database-2019-06-15_0300.tar.gz database-2019-07-01_0300.tar.gz database-2019-07-15_0300.tar.gz database-2019-08-01_0300.tar.gz database-2019-09-20_0300.14.tar.gz database-2019-09-01_0300.tar.gz     database-2019-09-15_0300.9.tar.gz   database-2019-09-18_0300.12.tar.gz  database-2019-09-19_0300.13.tar.gz  database-2019-09-21_0300.15.tar.gz database-2019-09-22_0300.16.tar.gz database-2019-09-23_0300.17.tar.gz database-2019-09-24_0300.18.tar.gz
  • 查看数据
[root@centos7-18 test2]# ls
database-2019-04-01_0300.tar.gz  database-2019-06-15_0300.tar.gz  database-2019-09-01_0300.tar.gz     database-2019-09-21_0300.15.tar.gz
database-2019-04-15_0300.tar.gz  database-2019-07-01_0300.tar.gz  database-2019-09-15_0300.9.tar.gz   database-2019-09-22_0300.16.tar.gz
database-2019-05-01_0300.tar.gz  database-2019-07-15_0300.tar.gz  database-2019-09-18_0300.12.tar.gz  database-2019-09-23_0300.17.tar.gz
database-2019-05-15_0300.tar.gz  database-2019-08-01_0300.tar.gz  database-2019-09-19_0300.13.tar.gz  database-2019-09-24_0300.18.tar.gz
database-2019-06-01_0300.tar.gz  database-2019-08-15_0300.tar.gz  database-2019-09-20_0300.14.tar.gz·
  • 以. 为分隔,按照第二列进行排序,采用字典序排序
[root@centos7-18 test2]# ls |sort -t. -k2
database-2019-09-18_0300.12.tar.gz
database-2019-09-19_0300.13.tar.gz
database-2019-09-20_0300.14.tar.gz
database-2019-09-21_0300.15.tar.gz
database-2019-09-22_0300.16.tar.gz
database-2019-09-23_0300.17.tar.gz
database-2019-09-24_0300.18.tar.gz
database-2019-09-15_0300.9.tar.gz
database-2019-04-01_0300.tar.gz
database-2019-04-15_0300.tar.gz
database-2019-05-01_0300.tar.gz
database-2019-05-15_0300.tar.gz
database-2019-06-01_0300.tar.gz
database-2019-06-15_0300.tar.gz
database-2019-07-01_0300.tar.gz
database-2019-07-15_0300.tar.gz
database-2019-08-01_0300.tar.gz
database-2019-08-15_0300.tar.gz
database-2019-09-01_0300.tar.gz

可以看到,先分隔,再指定某列进行按照字典序排序,此时字母比数字大,现象是正常的

  • 以. 为分隔,按照第二列进行排序,并且采用数值排序
[root@centos7-18 test2]# ls |sort -t. -k2n
database-2019-04-01_0300.tar.gz
database-2019-04-15_0300.tar.gz
database-2019-05-01_0300.tar.gz
database-2019-05-15_0300.tar.gz
database-2019-06-01_0300.tar.gz
database-2019-06-15_0300.tar.gz
database-2019-07-01_0300.tar.gz
database-2019-07-15_0300.tar.gz
database-2019-08-01_0300.tar.gz
database-2019-08-15_0300.tar.gz
database-2019-09-01_0300.tar.gz
database-2019-09-15_0300.9.tar.gz
database-2019-09-18_0300.12.tar.gz
database-2019-09-19_0300.13.tar.gz
database-2019-09-20_0300.14.tar.gz
database-2019-09-21_0300.15.tar.gz
database-2019-09-22_0300.16.tar.gz
database-2019-09-23_0300.17.tar.gz
database-2019-09-24_0300.18.tar.gz

可以看到,此时使用的是按照第二列的数值进行排序(第一列默认使用字典序排序),现象是正常的

  • 以. 为分隔,按照第二列进行排序,并且采用数值排序,同时逆序
[root@centos7-18 test2]# ls |sort -t. -k2nr
database-2019-09-24_0300.18.tar.gz
database-2019-09-23_0300.17.tar.gz
database-2019-09-22_0300.16.tar.gz
database-2019-09-21_0300.15.tar.gz
database-2019-09-20_0300.14.tar.gz
database-2019-09-19_0300.13.tar.gz
database-2019-09-18_0300.12.tar.gz
database-2019-09-15_0300.9.tar.gz
database-2019-04-01_0300.tar.gz
database-2019-04-15_0300.tar.gz
database-2019-05-01_0300.tar.gz
database-2019-05-15_0300.tar.gz
database-2019-06-01_0300.tar.gz
database-2019-06-15_0300.tar.gz
database-2019-07-01_0300.tar.gz
database-2019-07-15_0300.tar.gz
database-2019-08-01_0300.tar.gz
database-2019-08-15_0300.tar.gz
database-2019-09-01_0300.tar.gz

可以看到,后面如下文件,并没有逆序排列

database-2019-04-01_0300.tar.gz
database-2019-04-15_0300.tar.gz
database-2019-05-01_0300.tar.gz
database-2019-05-15_0300.tar.gz
database-2019-06-01_0300.tar.gz
database-2019-06-15_0300.tar.gz
database-2019-07-01_0300.tar.gz
database-2019-07-15_0300.tar.gz
database-2019-08-01_0300.tar.gz
database-2019-08-15_0300.tar.gz
database-2019-09-01_0300.tar.gz
  • 如果想实现,后面那些文件也逆序排列,可以使用如下代码
[root@centos7-18 test2]# ls |sort -t. -k2n |sort -r
database-2019-09-24_0300.18.tar.gz
database-2019-09-23_0300.17.tar.gz
database-2019-09-22_0300.16.tar.gz
database-2019-09-21_0300.15.tar.gz
database-2019-09-20_0300.14.tar.gz
database-2019-09-19_0300.13.tar.gz
database-2019-09-18_0300.12.tar.gz
database-2019-09-15_0300.9.tar.gz
database-2019-09-01_0300.tar.gz
database-2019-08-15_0300.tar.gz
database-2019-08-01_0300.tar.gz
database-2019-07-15_0300.tar.gz
database-2019-07-01_0300.tar.gz
database-2019-06-15_0300.tar.gz
database-2019-06-01_0300.tar.gz
database-2019-05-15_0300.tar.gz
database-2019-05-01_0300.tar.gz
database-2019-04-15_0300.tar.gz
database-2019-04-01_0300.tar.gz

抽象成简单例子

  • 构造数据
[root@centos7-18 test5]# ls
d1.tar.gz  d2.tar.gz  d3.tar.gz
  • 测试
[root@centos7-18 test5]# ls |sort -t. -k2
d1.tar.gz
d2.tar.gz
d3.tar.gz
[root@centos7-18 test5]# 
[root@centos7-18 test5]# ls |sort -t. -k2n
d1.tar.gz
d2.tar.gz
d3.tar.gz
[root@centos7-18 test5]# ls |sort -t. -k2nr
d1.tar.gz
d2.tar.gz
d3.tar.gz

可以看到,当参数与-k2写在一起的时候,该参数只针对第2列有效,对第一列的排序不起作用

  • 如果想对整个字符串起作用,需要将参数单独写出来,如下
[root@centos7-18 test5]# ls |sort -t. -k2 -n
d1.tar.gz
d2.tar.gz
d3.tar.gz
[root@centos7-18 test5]# ls |sort -t. -k2 -n -r
d3.tar.gz
d2.tar.gz
d1.tar.gz
posted @ 2019-09-24 21:07  岳麓丹枫  阅读(308)  评论(0编辑  收藏  举报