每日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