关于sort命令的文章已经有很多,在此我也会略带转载一下常用的参数,今天我重点要写的内容是sort 与 strcmp 排序的结果不一样呢。
首先,看一下例子:
<pre name="code" class="html">[root@nn ~]# rpm -qa | sort
glib2-2.28.8-4.el6.x86_64glib2-devel-2.28.8-4.el6.x86_64glibc-2.12-1.166.el6_7.7.x86_64glibc-common-2.12-1.166.el6_7.7.x86_64glibc-devel-2.12-1.166.el6_7.7.x86_64glibc-headers-2.12-1.166.el6_7.7.x86_64glibc-static-2.12-1.166.el6_7.7.x86_64glibmm24-2.22.1-1.el6.x86_64glib-networking-2.28.6.1-2.2.el6.x86_64glusterfs-3.6.0.54-1.el6.x86_64
你有没有发现glib-networking 比glibc-common小,而在用strcmp()函数时glibc-common较大,strcmp()函数大家应该都知道是根据ASCII逐位比较大小的。在ASCII中,中划线(-)是45,而小写字母是90多,因此glibc-common大,更符合大家的逻辑思维。
但是你有没有注意这里的警告呢:
[root@nn ~]# man sort
*** WARNING *** The locale specified by the environment affects sort order. Set LC_ALL=C to get the traditional sort order that uses native
byte values.
我们看一下此时的环境变量
[root@nn ~]# echo $LC_ALL
zh_CN.UTF-8
[root@nn ~]#
那么我们将环境变量改成C呢
[root@nn ~]# export LC_ALL=C; rpm -qa | sort >c
[root@nn ~]#
glib-networking-2.28.6.1-2.2.el6.x86_64
glib2-2.28.8-4.el6.x86_64
glib2-devel-2.28.8-4.el6.x86_64
glibc-2.12-1.166.el6_7.7.x86_64
glibc-common-2.12-1.166.el6_7.7.x86_64
glibc-devel-2.12-1.166.el6_7.7.x86_64
可以看出此时的结果sort 和strcmp 是一样的。
由这个例子,我们可以知道环境变量的重要性。不同的环境变量会导致不同的结果。
下面转载了一下sort的常用选项
-b:忽略每行前面开始出的空格字符;
-c:检查文件是否已经按照顺序排序;
-d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符;
-f:排序时,将小写字母视为大写字母;
-i:排序时,除了040至176之间的ASCII字符外,忽略其他的字符;
-m:将几个排序号的文件进行合并;
-M:将前面3个字母依照月份的缩写进行排序;
-n:依照数值的大小排序;
-o<输出文件>:将排序后的结果存入制定的文件;
-r:以相反的顺序来排序;
-t<分隔字符>:指定排序时所用的栏位分隔字符; +<起始栏位>-<结束栏位>:以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。