Linux 管理员 - sort 命令

sort 对基于数据类型的排序进行了多项优化。该命令将所有文件的排序串联写入标准输出。但是,请注意,对几 GB 的大文件进行复杂的排序操作可能会影响系统性能。

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

开关 操作
-b 忽略前导空行
-d 字典顺序,仅考虑空格和字母数字字符
-f 忽略大小写,折叠小写和大写字符
-g 一般数字排序
-M 月份排序
-h 人类可读的数字排序 1KB、1MB、1GB
-R 随机排序
-m 合并已排序的文件

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

first name last name office
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 开关对其他列进行排序。

-t:定义文件分隔符
-k:排序的键计数(将其视为分隔符指定的列。
-n:按数字顺序排序

注意 − 在一些示例中,我们使用 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 的文字 Tab 字符。可以使用以下组合键将文字 Tab 发送到 BASH shell:control+Tab+v

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

让我们修复 names.txt 文件。

[root@centosLocal centos]# sed -i 's/	/:/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/:/ /g' ./Documents/names.txt

常见的最终用户应用程序将很好地使用制表符作为分隔符(会计师在处理电子表格时不希望看到冒号分隔数据列)。因此,学习来回转换字符是一种很好的做法;它经常出现。

注意 − Office 使用在 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 命令时,将对此进行更多介绍。