Linux管理员 - sort 命令



sort命令针对基于数据类型的排序进行了一些优化。此命令将所有文件的排序连接写入标准输出。但是,需要注意的是,对几个GB的大文件的复杂排序操作可能会影响系统性能。

当运行具有有限CPU和/或内存可用性的生产服务器时,建议在高峰业务时间将这些较大的文件卸载到工作站进行排序操作。

开关 功能
-b 忽略开头的空行
-d 字典顺序,只考虑空格和字母数字字符
-f 忽略大小写,折叠大小写字符
-g 常规数值排序
-M 月份排序
-h 人类可读的数值排序 1KB,1MB,1GB
-R 随机排序
-m 合并已排序的文件

随意复制下面的表格文本,并按照我们的sort示例进行操作。确保每列都用制表符分隔。

名字 姓氏 办公室
Ted Daniel 101
Jenny Colon 608
Dana Maxwell 602
Marian Little 903
Bobbie Chapman 403
Nicolas Singleton 203
Dale Barton 901
Aaron Dennis 305
Santos Andrews 504
Jacqueline Neal 102
Billy Crawford 301
Rosa Summers 405
Kellie Curtis 903
Matt Davis 305
Gina Carr 902
Francisco Gilbert 101
Sidney Mack 901
Heidi Simmons 204
Cristina Torres 206
Sonya Weaver 403
Donald Evans 403
Gwendolyn Chambers 108
Antonia Lucas 901
Blanche Hayes 603
Carrie Todd 201
Terence Anderson 501
Joan Parsons 102
Rose Fisher 304
Malcolm Matthews 702

使用sort命令最基本的默认形式:

[root@centosLocal centos]# sort ./Documents/names.txt  
Aaron         Dennis         305 
Antonia       Lucas          901 
Billy         Crawford       301 
Blanche       Hayes          603 
Bobbie        Chapman        403 
Carrie        Todd           201 
Cristina      Torres         206 
Dale          Barton         901 
Dana          Maxwell        602 
Donald        Evans          403 
Francisco     Gilbert        101 
Gina          Carr           902 
Gwendolyn     Chambers       108 
Heidi         Simmons        204 
Jacqueline    Neal           102 
Jenny         Colon          608 
Joan          Parsons        102 
Kellie        Curtis         903 
Malcolm       Matthews       702 
Marian        Little         903 
Matt          Davis          305 
Nicolas      Singleton       203 
Rosa         Summers         405 
Rose         Fisher          304 
Santos       Andrews         504 
Sidney       Mack            901 
Sonya        Weaver          403 
Ted          Daniel          101 
Terence      Anderson        501

[root@centosLocal centos]#

有时,我们希望根据除第一列以外的其他列对文件进行排序。可以使用-t-k开关将sort应用于其他列。

-t : define a file delimiter 
-k : key count to sort by (think of this as a column specified from the delimiter. 
-n : sort in numeric order

注意 - 在某些示例中,我们使用了cat管道到grep。这是为了演示管道命令的概念。对于大型文件,将cat输出到grep会使系统负载增加数百倍,同时还会增加复杂的排序。这会让资深的Linux管理员感到痛苦。

现在我们了解了管道字符的工作原理,在接下来的章节中将避免这种不好的做法。保持系统资源低的关键在于学习如何高效地使用像sort这样的命令。

[root@centosLocal centos]# sort -t '    ' -k 3n ./Documents/names.txt  
Ted           Daniel           101 
Francisco     Gilbert          101 
Jacqueline    Neal             102 
Joan          Parsons          102 
Gwendolyn     Chambers         108 
Carrie        Todd             201 
Nicolas       Singleton        203 
Heidi         Simmons          204 
Cristina      Torres           206 
Billy         Crawford         301 
Rose          Fisher           304 
Aaron         Dennis           305 
Matt          Davis            305 
Bobbie        Chapman          403 
Donald        Evans            403 
Sonya         Weaver           403 
Rosa          Summers          405 
Terence       Anderson         501 
Santos        Andrews          504 
Dana          Maxwell          602 
Blanche       Hayes            603 
Jenny         Colon            608 
Malcolm       Matthews         702
Antonia       Lucas            901 
Dale          Barton           901 
Sidney        Mack             901 
Gina          Carr             902 
Kellie        Curtis           903  
Marian        Little           903 

[root@centosLocal centos]#

现在我们的列表按办公室编号排序。细心的读者会在-t开关之后注意到一些不寻常的地方;单引号分隔了看起来像是几个空格的东西。这实际上是发送到shell的文字制表符。可以使用以下按键组合将文字制表符发送到BASH shell:control+Shift+v

大多数shell会将Tab键解释为命令。例如,BASH中的自动补全。shell需要一个转义序列来识别文字制表符。这就是制表符不是Linux分隔符的最佳选择的原因之一。一般来说,最好避免空格和制表符,因为它们在编写shell脚本时可能会导致问题。

让我们修复我们的names.txt文件。

[root@centosLocal centos]# sed -i 's/\t/:/g' ./Documents/names.txt && 
cat ./Documents/names.txt 
Ted:Daniel:101 
Jenny:Colon:608 
Dana:Maxwell:602 
Marian:Little:903 
Bobbie:Chapman:403 
Nicolas:Singleton:203 
Dale:Barton:901 
Aaron:Dennis:305 
Santos:Andrews:504 
Jacqueline:Neal:102 
Billy:Crawford:301 
Rosa:Summers:405 
Kellie:Curtis:903: 
Matt:Davis:305 
Gina:Carr:902 
Francisco:Gilbert:101 
Sidney:Mack:901 
Heidi:Simmons:204 
Cristina:Torres:206
Sonya:Weaver:403 
Donald:Evans:403 
Gwendolyn:Chambers:108 
Antonia:Lucas:901 
Blanche:Hayes:603 
Carrie:Todd:201 
Terence:Anderson:501 
Joan:Parsons:102 
Rose:Fisher:304 
Malcolm: Matthews:702 
[root@centosLocal centos]#

现在,处理文本文件会容易得多。如果有人要求将其转换回制表符分隔符以用于另一个应用程序(这很常见),我们可以轻松完成此任务,如下所示:

sed -i 's/:/\t/g' ./Documents/names.txt

常见的最终用户应用程序可以很好地使用制表符作为分隔符(会计师不想看到冒号分隔数据列,同时使用电子表格)。因此,学习来回转换字符是一种良好的实践;这种情况经常出现。

注意 - 办公室使用运行在Windows上的具有图形用户界面的文字处理器和电子表格。因此,Linux管理员通常擅长完成转换操作,以适应最终办公室用户(大多数情况下,我们的老板将是最终用户)。

介绍了一个名为sed的命令。sed是一个流编辑器,可以用作非交互式文本编辑器来操作文本流和文件。我们稍后将学习更多关于sed的内容。但是,现在请记住,使用sed,我们避免了在更改文本文件时需要管道多个过滤器命令。从而最大限度地提高了所用工具的效率。

我们还介绍了一个Bash shell运算符:&&。只有当第一个命令以“0”的成功状态完成时,&&才会运行第二个命令。

[root@centosLocal centos]# ls /noDir &&  echo "You cannot see me" 
ls: cannot access /noDir: No such file or directory 
[root@centosLocal centos]# ls /noDir ;  echo "You cannot see me" 
ls: cannot access /noDir: No such file or directory 
You cannot see me 
[root@centosLocal centos]# ls /noDir ;  echo "You cannot see me"

在上面的代码中,请注意&&和;之间的区别?第一个只有在第一个成功完成时才会运行第二个命令,而;只是将命令链接起来。当我们学习shell命令脚本时,将对此进行更多介绍。

广告