uniq & sort - 去重和排序

uniq - 去重

语法: uniq [-c|-d|-u|-i] [input] [output]

  • -c, --count:在每列旁边显示重复出现的次数

    点击查看代码
    # 准备文档
    [root@node02 ~]# cat a
    aa
    aa
    bb
    Bb
    BB
    cc
    
    # 去重,显示每个字符串去重后的次数
    [root@node02 ~]# uniq -c a
    	  2 aa
    	  1 bb
    	  1 Bb
    	  1 BB
    	  1 cc
    
  • -d, --repeated:仅显示重复出现的列“内容”

  • -D:显示所有重复的列

  • -u, --unique:仅显示出一次的行列

    点击查看代码
    # 准备文档
    [root@node02 ~]# cat a
    aa
    aa
    bb
    Bb
    BB
    cc
    
    # 只显示重复出现的行(聚合显示)
    [root@node02 ~]# uniq -d a
    aa
    
    # 只显示重复出现的行(全部显示)
    [root@node02 ~]# uniq -D a
    aa
    aa
    
    # 去重,显示出现一次的
    [root@node02 ~]# uniq -u a
    bb
    Bb
    BB
    cc
    
  • -f:忽略前N列进行去重

  • -s:忽略前N个字符进行去重

  • -i:忽略大小写

    点击查看代码
    # 准备文档
    [root@node02 ~]# cat a
    aa c
    aa c
    bb b
    Bb b
    BB a
    cc a
    da e
    
    # 忽略前n列进行去重,重复的只显示第一次出现的内容
    [root@node02 ~]# uniq -f 1 a
    aa c
    bb b
    BB a
    da e
    
    # 忽略前n个字符进行去重操作
    [root@node02 ~]# uniq -i a
    aa c
    bb b
    BB a
    cc a
    da e
    
  • [input]:指定去重的文件, 不指定则从标准流读取

  • [output]:指定写入结果的文件, 不指定则输出到终端

    点击查看代码
    # 准备文档
    [root@node02 ~]# cat a
    aa
    aa
    bb
    Bb
    BB
    cc
    
    # 去重后,输入到文件 b
    [root@node02 ~]# uniq -ci a b
    # 验证
    [root@node02 ~]# cat b
    	  2 aa
    	  3 bb
    	  1 cc
    
    	# 通过标准流读取
    [root@node02 ~]# cat a | uniq -c
    	  2 aa
    	  1 bb
    	  1 Bb
    	  1 BB
    	  1 cc
    

sort - 排序

语法: sort [option] [input]

  • -n: 通常情况下是按照“位+数字”的方式排序,指定-n后按数字大小排序

  • -r: 反序

    点击查看代码
    # 准备文件
    [root@node02 ~]# cat a
    1
    11
    7
    99
    
    # 按数字排序
    [root@node02 ~]# sort -n a
    1
    7
    11
    99
    
    # 反序
    [root@master ~]# sort -nr b
    99
    11
    7
    1
    
  • -t<分隔符>: 指定排序时用的分隔符

  • -k: 指定列排序,可以指定起止的列和字符(见示例),

  • 一般情况下-t-k结合使用,先使用-t指定分隔符,再使用-k指定列去做排列

    点击查看代码
    # 准备文件
    [root@node02 ~]# cat a
    3:1
    9:11
    2:2
    
    # 设置分隔符为:,按第二列内容排序
    [root@node02 ~]# sort -t: a
    3:1
    9:11
    2:2
    
    高级用法:-k X.m,Y.n
    # -k X.m,Y.n
    # 从X列的第m个字符作为起始位置排序,结束位置是Y列的第n个字符
    # 可以指定多个 -k
    # 结束位置我感觉用处不大
    
    # 准备文件
    [root@node02 ~]# cat a
    12 9 3000
    12 7 20000
    31 8 100
    
    # 先按照第1列第二个字符进行排序,在根据第3列排序
    [root@node02 ~]# sort -n -k 1.2 -k 3 a
    31 8 100
    12 7 20000
    12 9 3000
    
  • -c: 检查是否已经按照顺序排序,如果未排序,返回第一个次序不对的内容

  • -o [output]: 将排序后结果输出到文件

    点击查看代码
    # 准备文件
    [root@node02 ~]# cat a
    3:1
    9:11
    2:2
    
    # 检查排序是否正确,该结果表示从第三行开始排序出现异常
    [root@node02 ~]# sort -c a
    sort:a:3:无序: 2:2
    
    # 排序输出到新文件并检查,无返回表示排序正确
    [root@node02 ~]# sort a -o b
    [root@node02 ~]# sort -c b
    
  • -h: 可排序 MB,GB 等单位

    点击查看代码
    # -h 可以针对内存或磁盘空间大小单位进行排序
    [root@node02 ~]# sort -h b
    20KB
    3000MB
    1TB
    11TB
    
  • -b: 忽略每行前边开始出现的空格符

  • -f: 排序时, 将小写字母视为大写字母

  • [input]: 需要排序的文件列表, 可以指定多个


示例

# awk,sort,uniq 配合使用从 nginx 日志中统计访问数量最多的 5 个 ip
awk -F"|" '{print $3}' log | sort | uniq c | sort -nr | head -5

"""
1. 使用 awk 工具, 指定分隔符为'|', 指定输入文件 log,输出第三列内容,讲结果传给管道符
2. 接收的只有一列,直接使用 sort 排序
3. 使用 uniq 进行去重,指定 -cd 显示重复访问的 IP,此时数据被处理为 <次数> <ip>
4. 使用 sort 排序,指定 -nr 以数字大小排序,并且反序
5. 使用 head -5 输出最高的 5 条数据
"""
posted @   难德糊涂  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示