Linux系统比较两个已排序文件的实用工具之comm

发布于:2025-09-01 ⋅ 阅读:(18) ⋅ 点赞:(0)

目录

1. 🖥️ 基本语法与输出说明

2. 🔍 常用选项组合与实战场景

3. ⚙️ 处理未排序文件与自定义格式

4. 🤔 常见问题与技巧

5. 💡 综合实战案例

5.1 分析日志变化​​:

5.2 快速比较目录内容​​:

5.3 检查配置变更​​:

6. 💎 总结


comm 命令是 Linux 中用于比较两个​已排序文件​的实用工具,它能清晰展示文件间的差异共同内容。下面通过一些典型场景和示例来帮助你掌握它的用法。

1. 🖥️ 基本语法与输出说明

comm 命令的基本语法如下:

comm [OPTION]... FILE1 FILE2

​默认情况下​​,comm 会生成​​三列输出​​:

  • ∙​​第一列​​:仅存在于 FILE1 中的行。
  • ∙​​第二列​​:仅存在于 FILE2 中的行。
  • ∙​​第三列​​:两个文件共有的行。
  •  列之间默认以​​制表符(\t)​​ 分隔

假设你有两个已排序的文件:

[root@centos79-20251123 ~]# cat   file1.txt
apple
banana
cherry
[root@centos79-20251123 ~]# cat   file2.txt
banana
date
elderberry

直接比较它们:

comm file1.txt file2.txt

输出结果会是:

[root@centos79-20251123 ~]# comm   file1.txt   file2.txt
apple
		        banana
cherry
	   date
	   elderberry

注意:第二列(仅 file2 有)的内容在输出中会有一个前导的制表符,第三列(共有)则有两个前导的表符,这使得视觉上各列是错开的。

2. 🔍 常用选项组合与实战场景

通过组合 -1-2-3 选项,可以灵活筛选需要的内容。

选项组合 作用 命令示例 上文示例中的结果
-23 ​仅显示第一个文件独有的行​ comm -23 file1.txt file2.txt applecherry
-13 ​仅显示第二个文件独有的行​ comm -13 file1.txt file2.txt dateelderberry
-12 ​仅显示两个文件共有的行​ comm -12 file1.txt file2.txt banana

这些选项可以单独或组合使用,例如 -2 会抑制第二列(仅FILE2存在)的显示。

3. ⚙️ 处理未排序文件与自定义格式

​重要前提​​:comm 命令要求输入文件必须是​已排序的​​(通常按字母顺序)。如果文件未排序,直接比较会得到错误结果,甚至报错:comm: file 1 is not in sorted order

处理未排序文件的方法是先用 sort 命令排序。你可以排序后保存为新文件再比较:

sort unsorted1.txt > sorted1.txt
sort unsorted2.txt > sorted2.txt
comm sorted1.txt sorted2.txt

或者使用​​进程替换​​(Process Substitution)直接比较:

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

你可以用 --output-delimiter 选项改变默认的列分隔符,例如使用逗号:

comm --output-delimiter="," file1.txt file2.txt

输出会变为:

apple,,banana
cherry,date,elderberry

请注意,​​分隔符会替换原有的制表符对齐方式​​,可能使列不再对齐,但内容对应关系不变。

4. 🤔 常见问题与技巧

  • ∙​​报错“文件未排序”​​:这表示输入文件未按要求排序。请务必先用 sort 命令处理文件。
  • ∙​​忽略大小写比较​​:comm 默认​​区分大小写​​。若需忽略,可先统一大小写再排序比较:
comm <(tr '[:upper:]' '[:lower:]' < file1.txt | sort) <(tr '[:upper:]' '[:lower:]' < file2.txt | sort)
  • ∙​​与 diffgrep 的区别​​:
    命令 特点 适用场景
    comm 三列输出,需预排序 精确行级比较,区分“A独有、B独有、共同”
    diff 显示差异内容,支持未排序文件 变更详情分析,查看差异上下文
    grep -f 模式匹配,无需排序 快速查找一个文件中的行是否存在于另一个文件

5. 💡 综合实战案例

5.1 分析日志变化​​:

提取两天日志中的独立 IP,找出第二天新增的 IP

# 提取day1的独立IP并排序
grep -oE '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' day1.log | sort -u > day1_ips.txt
# 提取day2的独立IP并排序
grep -oE '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' day2.log | sort -u > day2_ips.txt
# 找出只在day2中出现的IP
comm -13 day1_ips.txt day2_ips.txt > new_ips.txt
5.2 快速比较目录内容​​:

比较两个目录中(去除路径后)文件名异同

# 获取dir1的文件名列表并排序
ls dir1 | sort > dir1_files.txt
# 获取dir2的文件名列表并排序
ls dir2 | sort > dir2_files.txt
# 找出两个目录中都存在的文件
comm -12 dir1_files.txt dir2_files.txt
5.3 检查配置变更​​:

动态比较当前配置与备份配置的差异。

comm -3 <(sort current.config) <(sort backup.config)

6. 💎 总结

comm 命令在需要​​精确比对两个已排序数据集​​的差异项,并明确区分“A独有、B独有、共同拥有”三类结果时特别有用。记住它的​​两个关键点​​:一是输入文件必须预先排序,二是灵活运用 -1-2-3 选项组合来过滤输出。


网站公告

今日签到

点亮在社区的每一天
去签到