uniq、sort命令理解

Published on with 0 views and 0 comments

先建立一个测试文件:

[root@bogon ~]# cat test.txt 
10.0.0.1
10.0.0.3
10.0.0.4
10.0.0.4
10.0.0.5
10.0.0.1
10.0.0.3
10.0.0.5

先看下 uniq 参数

-c, --count
              在 行首 显示 出现 的 数目

-d, --repeated
              仅显示 重复行

-D, --all-repeated
              显示 全部 重复行

-f, --skip-fields=N
              不比较 起初的 N 栏
-i, --ignore-case
              比较时 忽略 大小写
-s, --skip-chars=N
              不比较 起初的 N 个 字符

-u, --unique
              仅显示 无重复行

-w, --check-chars=N
              每行中 比较 不超过 N 个 字符

-N     同 -f N

+N     同 -s N
--help 显示 帮助信息, 然后 结束

--version
              显示 版本信息, 然后 结束

1. 只输入 uniq 看下:

[root@bogon ~]# uniq test.txt 

10.0.0.1
10.0.0.3
10.0.0.4
10.0.0.5
10.0.0.1
10.0.0.3
10.0.0.5

ps:发现和原文件相比,只是把相邻的内容去重;
如果要把所有的去除,就要用到 sort,sort 是排序的命令,让重复的行相邻

[root@bogon ~]# sort test.txt
10.0.0.1
10.0.0.1
10.0.0.3
10.0.0.3
10.0.0.4
10.0.0.4
10.0.0.5
10.0.0.5

两者都用的话,效果如下:

[root@bogon ~]# sort test.txt | uniq 
10.0.0.1
10.0.0.3
10.0.0.4
10.0.0.5

2. 如果让去重的行相邻并且计数:

[root@bogon ~]# sort test.txt | uniq -c
      1 
      2 10.0.0.1
      2 10.0.0.3
      2 10.0.0.4
      2 10.0.0.5

倒序效果

[root@bogon ~]# cat test.txt | sort | uniq -c | sort -r

      3 10.0.0.5
      2 10.0.0.4
      2 10.0.0.3
      2 10.0.0.1

3.sort 中的-k 参数

-b     忽略排序字段或关键字中开头的空格

       -c     检查是否指定文件已经排序好了,不排序.

       -d     在关键字中只考虑[a-zA-Z0-9]字符.

       -f     将关键字中的小写字母折合成大写字母.

       -g     按照通常的数字值顺序作比较,暗含-b

       -i     在关键字中只考虑[\040-\0176]字符.

       -k POS1[,POS2]
              从关键字POS1开始,*到*POS2结束.  字段数和字符偏移量都从1开始计数(与基于零的+POS格式作比较)

       -l     按照当前环境排序.

       -m     合并已经排序好的文件,不排序.

       -M     按(未知的)<`JAN'<...<`DEC'的顺序比较,暗含-b

       -n     按照字符串的数值顺序比较,暗含-b

       -o FILE
              将结果写入FILE而不是标准输出.

       -r     颠倒比较的结果.

       -s     通过屏蔽最后的再分类比较来稳定排序.

       -t SEP 使用SEP来替代空格的转换non-.

       -T DIRECTORY
              使用DIRECTORY作为临时文件,而不是$TMPDIR或者/tmp

       -u     如果有-c,则按严格的顺序进行检查; 如果有-m,则只输出相等顺序的第一个.

       -z     以0字节结束行,而不是使用换行符,这是为了找到-print0

       --help 显示帮助并退出.

       --version
              输出版本信息并退出.

看下需求:实现倒序或者升序用 sort

[root@bogon conf]# cat arp.txt 
192.168.89.234	d481-d7b1-fb75	
192.168.89.154	0080-4df0-4ba1	
192.168.89.161	d89e-f319-5c74	
192.168.89.64	54bf-6470-5b59	
192.168.89.199	f0de-f1c1-7d78	
192.168.89.246	000e-c6b3-f84f	
192.168.89.116	00e0-4c6c-8842	
192.168.89.166	509a-4c29-823e	
192.168.89.100	f0de-f1d6-e7c6	
192.168.100.1	1430-0480-18cb
192.168.100.2	30b4-9e1e-c749	
192.168.100.100	8825-93cb-c814	
192.168.100.41	f409-d811-832f	
192.168.100.224	2c6e-85a5-67c5	
192.168.100.85	acbc-32bb-ebd7	
192.168.100.219	086d-41c6-657a	
192.168.100.16	8c85-9043-ebfa	
192.168.100.125	8c85-9086-43f0	
192.168.100.196	8438-3566-596e	
192.168.100.108	c4b3-01cf-c55f
192.168.100.93	0811-96d6-b8f8
  • 默认按照整行排序,
  • -t 指定分隔符,-k1,分隔符之后的第一列排序。
  • -k POS1[,POS2] >> 字段,字段 用逗号来分隔字段
    -k 1,1 表示从第一个字段开始,第一个字段结束
  • -k 1.1,3.3 用点分隔字符。 第一个字段的第一个字符开始排序到第三个字段的第三个字符结束
[root@bogon conf]# sort -t. -k3.1,3.3nr -k4.1,4.3nr arp.txt 

192.168.100.224	2c6e-85a5-67c5	
192.168.100.219	086d-41c6-657a	
192.168.100.196	8438-3566-596e	
192.168.100.125	8c85-9086-43f0	
192.168.100.108	c4b3-01cf-c55f
192.168.100.100	8825-93cb-c814	
192.168.100.93	0811-96d6-b8f8
192.168.100.85	acbc-32bb-ebd7	
192.168.100.41	f409-d811-832f	
192.168.100.16	8c85-9043-ebfa	
192.168.100.2	30b4-9e1e-c749	
192.168.100.1	1430-0480-18cb
192.168.89.246	000e-c6b3-f84f	
192.168.89.234	d481-d7b1-fb75	
192.168.89.199	f0de-f1c1-7d78	
192.168.89.166	509a-4c29-823e	
192.168.89.161	d89e-f319-5c74	
192.168.89.154	0080-4df0-4ba1	
192.168.89.116	00e0-4c6c-8842	
192.168.89.100	f0de-f1d6-e7c6	
192.168.89.64	54bf-6470-5b59

可以看出已经实现 ip 地址倒序排列


标题:uniq、sort命令理解
作者:cuijianzhe
地址:https://cuijianzhe.github.io/articles/2019/03/23/1553311254119.html