3.13 uniq:去除重复行
3.13.1 命令详解
【命令星级】 ★★★★★
【功能说明】
uniq命令可以输出或忽略文件中的重复行。在工作中,我们常用的场景是使用sort命令对文件排序,然后使用uniq命令去重并计数。
【语法格式】
uniq [option] [INPUT]
uniq [选项] [文件或标准输入]
**说明:**在uniq命令及后面的选项和文件里,每个元素直接都至少要有一个空格。
【选项说明】
表3-16针对该命令的参数选项进行了说明。
表3-16 uniq命令的参数选项及说明
3.13.2 使用范例
3.13.2.1 基础范例
**范例3-50:**去重测试案例。
[root@centos7 ~]# cat >neteagle2.txt<<EOF
> 10.0.0.4
> 10.0.0.4
> 10.0.0.4
> EOF
[root@centos7 ~]# uniq neteagle2.txt #不接任何参数即去除重复行。
10.0.0.4
[root@centos7 ~]# uniq -c neteagle2.txt #参数-c显示相应行出现的次数。
3 10.0.0.4
**范例3-51:**结合sort去重。
[root@centos7 ~]# cat neteagle.txt
10.0.0.4
10.0.0.4
10.0.0.4
10.0.0.5
10.0.0.4
10.0.0.8
[root@centos7 ~]# uniq neteagle.txt
10.0.0.4
10.0.0.5
10.0.0.4
10.0.0.8
#说明:还有2行是一样的。
[root@centos7 ~]# sort -n neteagle.txt |uniq -c
4 10.0.0.4
1 10.0.0.5
1 10.0.0.8
上面的测试结果表明uniq只能对相邻的重复行进行去重操作,因此应先用sort处理文件再去重。
3.13.2.2 企业面试题
**范例3-52:**处理以下文件内容,将域名取出,并根据域名进行计数排序处理。
neteagle.log文件的内容如下。
[root@centos7 ~]# cat >neteagle.log<<E0F
> http://www.etiantian.org/index.html
> http://www.etiantian.org/1.html
> http://post.etiantian.org/index.html
> http://mp3.etiantian.org/index.html
> http://www.etiantian.org/3.html
> http://post.etiantian.org/2.html
> EOF
解答:
[root@centos7 ~]# cat neteagle.log
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
[root@centos7 ~]# awk -F "/" '{print $3}' neteagle.log #awk命令会在后面的相关章节重点讲解。
www.etiantian.org
www.etiantian.org
post.etiantian.org
mp3.etiantian.org
www.etiantian.org
post.etiantian.org
[root@centos7 ~]# awk -F "/" '{print $3}' neteagle.log |sort|uniq -c 1 mp3.etiantian.org
2 post.etiantian.org
3 www.etiantian.org
[root@centos7 ~]# awk -F "/" '{print $3}' neteagle.log |sort|uniq -c|sort -rn #将上面的结果倒序排列。
3 www.etiantian.org
2 post.etiantian.org
1 mp3.etiantian.org
[root@centos7 ~]# cut -d '/' -f3 neteagle.log |sort|uniq -c |sort -rn #不用awk,用我们学过的cut命令。
3 www.etiantian.org
2 post.etiantian.org
1 mp3.etiantian.org
**提示:**本题也可以用awk的数组处理,见awk命令部分的讲解。
3.14 wc:统计文件的行数、单词数或字节数
3.14.1 命令详解
【命令星级】 ★★★★★
【功能说明】
wc命令用于统计文件的行数、单词数或字节数。
【语法格式】
wc [option] [file]
wc [选项] [文件]
**说明:**在wc命令及后面的选项和文件里,每个元素直接都至少要有一个空格。
【选项说明】
表3-17针对该命令的参数选项进行了说明。
表3-17 wc命令的参数选项及说明
3.14.2 使用范例
3.14.2.1 基础范例
**范例3-53:**查看文件的字节数、字数、行数等。
[root@centos7 ~]# wc /etc/inittab
17 80 511 /etc/inittab #不接任何参数,显示的数字是什么意思?
[root@centos7 ~]# wc -c /etc/inittab #字节数。
511 /etc/inittab
[root@centos7 ~]# wc -l /etc/inittab #行数。
17 /etc/inittab
[root@centos7 ~]# wc -m /etc/inittab #字符数。
511 /etc/inittab
[root@centos7 ~]# wc -w /etc/inittab #单词数。
80 /etc/inittab
[root@centos7 ~]# wc -L /etc/inittab #最长行的长度。
86 /etc/inittab
**范例3-54:**选项-L的使用。
通过for循环打印下面这句话中字母数不大于6的单词【1】(这曾是个面试题):
I am neteagle teacher welcome to neteagle trainning class.
[root@centos7 ~]# for word in I am neteagle teacher welcome to neteagle trainning class.;do [ `echo $word|wc -L` -le 6 ] && echo $word;done
I
am
to
class.
#上面是将一个Shell的for循环写成一行命令。这里用到了-L参数计算单词的长度。
[root@centos7 ~]for word in I am neteagle teacher welcome to neteagl
#!/bin/bash
for word in I am neteagle teacher welcome to neteagle trainning clas
s.
do
[ `echo $word|wc -L` -le 6 ] && \
echo $word
done
[root@centos7 ~]# sh wc.sh
I
am
to
class.
3.14.2.2 生产案例
**范例3-55:**查看登录系统的用户数。
[root@centos7 ~]# who #who命令能够查看有哪些用户登录系统,后面会详细讲解。
root pts/0 2020-10-23 14:30 (10.0.0.1)
root pts/1 2020-10-23 15:40 (10.0.0.1)
[root@centos7 ~]# who|wc -l #有时我们需要监控有多少用户登录系统,因此可用wc命令计算一共有几个人。
2