zl程序教程

您现在的位置是:首页 >  系统

当前栏目

linux基本功系列之uniq命令实战

Linux命令 系列 实战 基本功 uniq
2023-09-14 09:09:25 时间

前言

大家好,又见面了,我是沐风晓月,本文是专栏【linux基本功-基础命令实战】的第51篇文章。

专栏地址:[linux基本功-基础命令专栏] , 此专栏是沐风晓月对Linux常用命令的汇总,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。

如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。

🏠个人主页:我是沐风晓月
🧑个人简介:大家好,我是沐风晓月,双一流院校计算机专业😉😉
💕 座右铭: 先努力成长自己,再帮助更多的人 ,一起加油进步🍺🍺🍺
💕欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信😘

一. uniq的命令介绍

uniq用户重复数据的处理,使用前先用sort进行排序

主要用途有两个:

  • 将输入文件(或标准输入)中邻近的重复行写入到输出文件(或标准输出)中。
  • 当没有选项时,邻近的重复行将合并为一个。

二. 语法格式及常用选项

依据惯例,我们还是先查看帮助,使用 uniq --help

[root@mufeng ~]# uniq --help
用法:uniq [选项]... [文件]
Filter adjacent matching lines from INPUT (or standard input),
writing to OUTPUT (or standard output).

With no options, matching lines are merged to the first occurrence.

Mandatory arguments to long options are mandatory for short options too.
  -c, --count           prefix lines by the number of occurrences
  -d, --repeated        only print duplicate lines, one for each group
  -D, --all-repeated[=METHOD]  print all duplicate lines
                          groups can be delimited with an empty line
                          METHOD={none(default),prepend,separate}
  -f, --skip-fields=N   avoid comparing the first N fields
      --group[=METHOD]  show all items, separating groups with an empty line
                          METHOD={separate(default),prepend,append,both}
  -i, --ignore-case     ignore differences in case when comparing
  -s, --skip-chars=N    avoid comparing the first N characters
  -u, --unique          only print unique lines
  -z, --zero-terminated  end lines with 0 byte, not newline
  -w, --check-chars=N	对每行第N 个字符以后的内容不作对照
      --help		显示此帮助信息并退出
      --version		显示版本信息并退出


为了更直观一些,我们把常用的参数用表格来展示:

参数描述
-c, --count在每行开头增加重复次数。
-d, --repeated所有邻近的重复行只被打印一次。
-D所有邻近的重复行将全部打印。
–all-repeated[=METHOD]类似于 -D,但允许每组之间以空行分割。METHOD取值范围{none(默认),prepend,separate}。
-f, --skip-fields=N跳过对前N个列的比较。
–group[=METHOD]显示所有行,允许每组之间以空行分割。METHOD取值范围:{separate(默认),prepend,append,both}。
-i, --ignore-case忽略大小写的差异。
-s, --skip-chars=N跳过对前N个字符的比较。
-u, --unique只打印非邻近的重复行。
-z, --zero-terminated设置行终止符为NUL(空),而不是换行符。
-w, --check-chars=N只对每行前N个字符进行比较。
–help显示帮助信息并退出。
–version显示版本信息并退出。

这里需要注意一点:

uniq 不会检查重复的行,除非它们是相邻的行。

所以如果想先对输入排序,使用没有uniq 的"sort -u"

三. 参考案例

3.1 统计行数

last默认统计登录系统的用户和IP:

[root@mufeng ~]# last
root     pts/2        192.168.1.4      Mon Feb 27 15:22   still logged in   
root     pts/2        localhost        Mon Feb 27 14:59 - 14:59  (00:00)    
root     pts/2        192.168.1.56     Mon Feb 27 14:59 - 14:59  (00:00)    
root     pts/1        192.168.1.4      Mon Feb 27 14:51   still logged in   
root     pts/2        192.168.1.56     Mon Feb 27 14:48 - 14:51  (00:02)    
laoxin   pts/2        localhost        Mon Feb 27 14:44 - 14:45  (00:00)    
root     pts/2        localhost        Mon Feb 27 14:44 - 14:44  (00:00)    
root     pts/1        192.168.1.4      Mon Feb 27 14:38 - 14:51  (00:13)    
root     pts/0        :0               Thu Dec  8 20:00   still logged in   
root     :0           :0               Thu Dec  8 19:47   still logged in   
reboot   system boot  3.10.0-957.el7.x Thu Dec  8 19:36 - 19:41 (81+00:05)  

wtmp begins Thu Dec  8 19:36:35 2022

我们对last的输出进行操作,统计行数:

[root@mufeng ~]# last |awk '{S[$3]++}{for(a in S){print a}}' |sort |uniq -c |sort -rn
     13 192.168.1.4
     12 localhost
     11 192.168.1.56

3.2 对文本进行去重

使用uniq是无法对文件进行去重的,但是会把相邻的去掉:

[root@mufeng ~]# cat a.txt
apple
apple
banana
apple
banana
pear
apple
banana
pear
tiger
[root@mufeng ~]# cat a.txt |uniq
apple
banana
apple
banana
pear
apple
banana
pear
tiger

我们加上 -c参数统计,就发现只有相邻的被统计到一起了

[root@mufeng ~]# cat a.txt
apple
apple
banana
apple
banana
pear
apple
banana
pear
tiger
[root@mufeng ~]# cat a.txt |uniq
apple
banana
apple
banana
pear
apple
banana
pear
tiger

如果想要去重,需要结合sort命令,对文件进行排序后再去重

[root@mufeng ~]# cat a.txt |sort
apple
apple
apple
apple
banana
banana
banana
pear
pear
tiger

我们加上uniq和uniq -c来看效果:

[root@mufeng ~]# cat a.txt |sort |uniq
apple
banana
pear
tiger
[root@mufeng ~]# cat a.txt |sort |uniq -c
      4 apple
      3 banana
      2 pear
      1 tiger

可以看到加上-c参数,就统计了所有重复的行数,如果不加-c参数,只是去掉了重复的行,然后源文件不变。

3.3 显示不重复的行

显示不重复的行,我们需要使用 -u参数

[root@mufeng ~]# sort a.txt
apple
apple
apple
apple
banana
banana
banana
pear
pear
tiger
[root@mufeng ~]# sort a.txt |uniq -u
tiger

可以看到,当我们使用 -u参数的时候,最终结果只显示了不重复的行。

3.4 仅显示重复的行,且显示重复的行的所有行

这个和3.3的案例相反,3.3是显示了不重复的行,本题目是要显示所有重复的行,这时候用到 -D参数

[root@mufeng ~]# sort a.txt |uniq -D
apple
apple
apple
apple
banana
banana
banana
pear
pear

3.5 忽略字母大小写

忽略字母大小写使用 -i参数,比如我们在文本中在追加一个大写的APPLE

[root@mufeng ~]# echo APPLE >> a.txt

[root@mufeng ~]# sort a.txt |uniq -iD
apple
apple
apple
apple
APPLE
banana
banana
banana
pear
pear

可以看到大写APPLE也出现在了重复的行里,如果我们不加i默认是没有的:

[root@mufeng ~]# sort a.txt |uniq -c
      4 apple
      1 APPLE
      3 banana
      2 pear
      1 tiger
[root@mufeng ~]# sort a.txt |uniq -ic
      5 apple
      3 banana
      2 pear
      1 tiger
[root@mufeng ~

一旦我们加了i,apple的数量就增加了。

总结

uniq的命令用的场景也比较多,后面我们再一一探讨,沐风晓月!嗨,就到这里,再见吧!
🍻🍻🍻如果你喜欢的话,就不要吝惜你的一键三连了~

  • 💕 好啦,这就是今天要分享给大家的全部内容了,我们下期再见!
  • 💕 博客主页:mufeng.blog.csdn.net
  • 💕 本文由沐风晓月原创,首发于CSDN博客
  • 💕 每一个你想要学习的念头,都是未来的你像现在的你求救,不辜负未来,全力奔赴

请添加图片描述
在这里插入图片描述