Linux常用命令学习笔记:comm

1. 命令概述

  • 命令名称comm(英文全拼:common)
  • 核心功能:比较两个已排序的文件,显示共有行独有行
  • 主要用途:文件差异比较、数据去重、集合运算

2. 语法格式

comm [选项] 文件1 文件2

3. 常用选项

选项说明
-1不显示第1列(文件1独有行)
-2不显示第2列(文件2独有行)
-3不显示第3列(两个文件共有行)
--help显示帮助信息
--version显示版本信息

4. 输出格式说明

comm命令的输出分为三列:

  • 第1列:只在文件1中出现的行
  • 第2列:只在文件2中出现的行
  • 第3列:两个文件都有的行

5. 常用实例详解

(1) 基本用法

# 比较两个已排序的文件
comm file1.txt file2.txt

# 输出示例:
# 第1列:file1独有行
#       第2列:file2独有行
#              第3列:共有行

(2) 显示特定列

# 只显示两个文件的共有行
comm -12 file1.txt file2.txt

# 只显示文件1的独有行
comm -23 file1.txt file2.txt

# 只显示文件2的独有行
comm -13 file1.txt file2.txt

# 显示两个文件的差异行(独有行)
comm -3 file1.txt file2.txt

(3) 排序文件比较

# 先排序再比较
sort file1.txt > sorted1.txt
sort file2.txt > sorted2.txt
comm sorted1.txt sorted2.txt

# 直接排序并比较
comm <(sort file1.txt) <(sort file2.txt)

(4) 处理未排序文件

# 使用进程替换直接排序比较
comm <(sort file1.txt) <(sort file2.txt)

# 或者使用管道
sort file1.txt | comm - sorted2.txt

6. 实际应用场景

场景一:文件差异比较

# 比较两个配置文件的差异
comm -3 config1.txt config2.txt

# 找出配置文件新增的配置项
comm -13 config1.txt config2.txt

# 找出配置文件删除的配置项
comm -23 config1.txt config2.txt

场景二:数据去重

# 找出两个列表的共有元素
comm -12 list1.txt list2.txt

# 找出只在list1中的元素
comm -23 list1.txt list2.txt

# 找出只在list2中的元素
comm -13 list1.txt list2.txt

# 合并两个列表并去重
comm -3 list1.txt list2.txt | sort -u

场景三:用户管理

# 比较两个系统的用户列表
comm -3 <(cut -d: -f1 /etc/passwd | sort) <(ssh remote_host "cut -d: -f1 /etc/passwd" | sort)

# 找出本地新增的用户
comm -13 <(cut -d: -f1 /etc/passwd | sort) <(ssh remote_host "cut -d: -f1 /etc/passwd" | sort)

# 找出本地删除的用户
comm -23 <(cut -d: -f1 /etc/passwd | sort) <(ssh remote_host "cut -d: -f1 /etc/passwd" | sort)

场景四:日志分析

# 比较两天的日志文件
comm -3 <(sort log1.txt) <(sort log2.txt)

# 找出今天新增的日志条目
comm -13 <(sort log1.txt) <(sort log2.txt)

# 找出今天删除的日志条目
comm -23 <(sort log1.txt) <(sort log2.txt)

7. 与其他命令的区别

命令特点适用场景
comm比较两个已排序文件,显示三列结果集合运算、文件差异比较
diff逐行比较文件差异,显示具体修改详细差异对比、补丁生成
uniq删除重复行单文件去重
sort排序文件排序、去重、合并
join基于字段连接两个文件数据库式连接操作

8. 注意事项

  1. 文件必须排序comm要求输入文件必须按字典序排序,否则结果不正确
  2. 列分隔符:输出使用制表符分隔三列,可使用 tr转换
  3. 空行处理:空行也会参与比较
  4. 大小写敏感:默认区分大小写,可先转换为小写再比较
  5. 返回值:成功返回 0,失败返回非 0

9. 常见问题解决

(1) 文件未排序错误

# 错误:文件未排序
comm file1.txt file2.txt
# 输出:comm: file 1 is not in sorted order

# 解决方案:先排序
comm <(sort file1.txt) <(sort file2.txt)

(2) 制表符分隔问题

# 将制表符转换为空格
comm file1.txt file2.txt | tr '\t' ' '

# 或者使用 awk 格式化输出
comm file1.txt file2.txt | awk '{print "Col1:", $1, "Col2:", $2, "Col3:", $3}'

(3) 大小写不敏感比较

# 转换为小写再比较
comm <(tr '[:upper:]' '[:lower:]' < file1.txt | sort) <(tr '[:upper:]' '[:lower:]' < file2.txt | sort)

(4) 忽略空行

# 删除空行再比较
comm <(grep -v '^$' file1.txt | sort) <(grep -v '^$' file2.txt | sort)

核心要点总结

  • comm用于比较两个已排序文件,显示共有行和独有行
  • 输出三列:第1列(文件1独有)、第2列(文件2独有)、第3列(共有)
  • 常用选项-1-2-3分别控制三列的显示
  • 必须排序:输入文件必须按字典序排序,否则结果不正确
  • 实际应用:文件差异比较、数据去重、集合运算、用户管理、日志分析
  • 注意事项:制表符分隔、大小写敏感、空行处理

comm命令是集合运算和文件比较的实用工具,特别适合处理已排序的数据集。


作 者:南烛
链 接:https://www.itnotes.top/archives/335
来 源:IT笔记
文章版权归作者所有,转载请注明出处!


上一篇
下一篇