我们此处会用到 Linux 系统本身自带的命令 sortuniq ,若您不熟悉,可以先行了解

前言

我们经常会面临对比两个文件的差异,举一个具体的例子:

两个服务器作为服务 S 的负载均衡,都部署了 nginx 做了一些规则重写,但是请求同一个地址的表现是不一样的;

此时第一反应就是对比两个服务器配置文件之间的区别,如果配置不多肉眼还能查看到,但是配置多了就只能依靠工具来进行了;这个时候,如果习惯了某些客户端的工具也是一直有效的处理方案,此处介绍 Linux 里面的处理方案!

求两个文件交集

1
sort a.txt b.txt | uniq -d
  • sort a.txt b.txt 首先将文件 a.txtb.txt 中的内容合并,并按行排序。
  • uniq -d 接着对排好序的结果进行去重,只显示重复出现过的行,也就是在 a.txtb.txt 中都出现过的行。

求两个文件并集

1
sort a.txt b.txt | uniq 
  • sort a.txt b.txt 首先将文件 a.txtb.txt 中的内容合并,并按行排序。
  • uniq 将排好序的文本进行去重。默认情况下,uniq 只能去除相邻的重复行,所以才有前面的 sort 结合管道进行处理

求两个文件差集

1
2
3
4
5
# a.txt - b.txt
sort a.txt b.txt b.txt | uniq -u

# b.txt - a.txt
sort b.txt a.txt a.txt | uniq -u

a.txt - b.txt 为例子,意思是要求在 a.txt 中存在而在 b.txt 不存在的行。

  • sort a.txt b.txt b.txt 的两个 b.txt 就是为了去重的时候 b.txt 的所有行都能被剔除掉的
  • uniq -u 只输出出现一次的行,也就是经过管道处理后,只剩下 a.txt 存在而 b.txt 不存在的行了