北屋教程网

专注编程知识分享,从入门到精通的编程学习平台

每日Linux学习:超N的文本对比工具comm

comm 命令用于逐行比较两个已排序的文件,非常类似sql的join语句。使用前必须提前排序文件(可用 sort 命令),否则结果不可靠。结合3个参数的使用,会有一些非常实用的用法,本文将用大量的实例详细讲解。


一、示例文件准备

先创建两个已排序的文件:

# 文件1: fruits1.txt
apple
banana
grape
orange

# 文件2: fruits2.txt
banana
cherry
grape
kiwi


二、实例讲解

1、基础用法

comm fruits1.txt fruits2.txt

其默认输出三列(以制表符分隔):

第一列:仅 文件1 存在的行

第二列:仅 文件2 存在的行

第三列:两个文件共有的行

输出:

apple
banana
cherry
grape
kiwi
orange

第一列(无缩进):仅 fruits1.txt 有的行。输出:apple, orange

第二列(一个制表符缩进):仅 fruits2.txt 。输出:cherry, kiwi

第三列(两个制表符缩进):共有的行。输出:banana, grape


2、仅显示共有的行(隐藏第1、2列)

comm -12 fruits1.txt fruits2.txt

输出:

banana
grape

-1:隐藏第一列(仅文件1)

-2:隐藏第二列(仅文件2)

comm -12就是保留第三列(共有行),显示fruits1.txt与fruits2.txt的交集。


3、仅显示文件1独有的行

comm -23 fruits1.txt fruits2.txt

输出:

apple
orange

-2:隐藏第二列(仅文件2)

-3:隐藏第三列(共有)

comm -23就是保留第一列(文件1)中不同于第二列的信息。显示fruits1.txt中不同于fruits2.txt的信息。


4、仅显示文件2独有的行

comm -13 fruits1.txt fruits2.txt

输出:

cherry
kiwi

-1:隐藏第一列(仅文件1)

-3:隐藏第三列(共有)

comm -13保留第二列(仅文件2)中不同于第一列的信息。


5、处理未排序文件

先排序再比较(使用进程替换):

comm <(sort unsorted1.txt) <(sort unsorted2.txt)


注意事项

1、文件必须已排序,若未排序,请预先使用 sort file.txt > sorted_file.txt 预处理。

2、强制不检查排序(不推荐):--nocheck-order。

3、重复行的处理:

4、同一文件中的重复行会被视为不同行。例如:

# 文件1: aa.txt
apple
apple

# 文件2: bb.txt
apple

comm aa.txt bb.txt

输出:

apple
apple

第一个 apple 是共有行(第三列)。

第二个 apple 是文件1独有的行(第一列)。

所以推荐sort排序时加上-u参数,去掉重复行


最后给一个实践中的常用的实例:

在系统安全审计中经常会核查/etc/passwd文件,查看账号的异动,我们可以在生产系统上线后,将/etc/passwd文件做个备份,将这个备份文件作为基准文件,后面核查账号时通过comm对比passwd文件与基准文件差异,这样就轻松的完成核查。

假设基准(备份)文件名称:bak_passwd

#先将备份文件、passwd排序:
sort -u bak_passwd > base.txt
sort -u /etc/passwd > check.txt
#comm -23比较:
comm -23 check.txt base.txt
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言