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 命令时,将对此进行更多介绍。