sort命令将文件进行排序,并将排序结果标准输出。sort命令既可以从特定的文件,也可以从stdin中获取输入。
uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用。
sort命令的选项参数
1 | -b --ignore-leading-blanks 默认情况下整行都会进行排序,添加这个选项sort会忽略行开头的空格,从第一个非空白字符开始排序 |
-k
选项的用法相对比较复杂
创建一段示例文本
1 | a 50 baidu |
直接用sort
排序
1 | $ sort data.txt |
使用-k
选项指定排序第二行,不指定结束字段的话默认从指定字段扩展到行尾,也就是说-k 2
在下面的第一个示例排序中其实是等价于-k 2,3
的。
但是当增加了-n
选项时,不会默认扩展到行尾,也就是说-k 2n
不等价于-k 2,3n
、-k 2n,3
、-k 2n,3n
,这是因为按数值排序则程序只能识别数字前的符号-
,除此之外当遇到其他非数字时就会终止此次排序。因此-k 2n
等价于-k 2,2n
、-k 2n,2
、-k 2n,2n
。
1 | $ sort -k 2 data.txt #这里第二列按字符顺序进行了排序,使用-n选项排序才符合预期 |
指定字段字符进行排序
1 | $ sort -k 3.2 data.txt |
uniq命令的选项参数
1 | -c --count 在每一行前显示该行出现的次数 |
测试文本
1 | aaa |
uniq
命令基本要配合sort
命令,在排序好文件之后使用。先单独尝试一下效果
1 | $ uniq -c data.txt |
与之类似,-u
参数只能去除相邻的重复行,-d
参数只能输出相邻的重复行。
使用案例
获取系统中最常使用前十个命令以及使用的总次数
1 | $ history | awk -F " " '{print $2}' | sort | uniq -c | sort -k 1bnr | head -10 |
- 首先将
history
的输出管道到awk
awk
指定以空格为分隔符,输出第二列(也就是具体命令列)- 管道到
sort
进行排序 - 之后将结果管道到
uniq
为每条命令进行计数 - 然后继续将结果管道到
sort
根据第一列按数值倒序排序 - 最后利用
head
取结果的前十条