Linux系统比较两个已排序文件的实用工具之comm
目录
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
applebanana
cherrydateelderberry
注意:第二列(仅 file2 有)的内容在输出中会有一个前导的制表符,第三列(共有)则有两个前导的表符,这使得视觉上各列是错开的。
2. 🔍 常用选项组合与实战场景
通过组合 -1
, -2
, -3
选项,可以灵活筛选需要的内容。
选项组合 | 作用 | 命令示例 | 上文示例中的结果 |
---|---|---|---|
-23 | 仅显示第一个文件独有的行 | comm -23 file1.txt file2.txt | apple , cherry |
-13 | 仅显示第二个文件独有的行 | comm -13 file1.txt file2.txt | date , elderberry |
-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)
- ∙与
diff
,grep
的区别:命令 特点 适用场景 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
选项组合来过滤输出。