当前位置: 首页 > news >正文

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.txtapplecherry
-13​仅显示第二个文件独有的行​comm -13 file1.txt file2.txtdateelderberry
-12​仅显示两个文件共有的行​comm -12 file1.txt file2.txtbanana

这些选项可以单独或组合使用,例如 -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 选项组合来过滤输出。

http://www.dtcms.com/a/359665.html

相关文章:

  • R3:适用于 .NET 的新一代响应式扩展库,事件订阅流
  • HarmonyOS 应用开发:基于API 12及以上的新特性与实践
  • 视觉大模型与多模态理解
  • MySQL直接启动命令mysqld详解:从参数说明到故障排查
  • 容器seccomp配置文件在云服务器安全策略中的实施规范
  • 基于单片机老人防丢失防摔倒系统/老人健康状态检测系统
  • 神州数码VRRP 原理与配置篇
  • 【lua】二进制数据打包和解析
  • 使用 Python 自动化检查矢量面数据的拓扑错误(含导出/删除选项)
  • 【C++ 】STL详解(六)—手撸一个属于你的 list!
  • Lua基础知识精炼
  • vscode+EIDE+Clangd环境导入keil C51以及MDK工程
  • PortSwigger靶场之Stored XSS into HTML context with nothing encoded通关秘籍
  • AG32 Nano开发板的烧录与调试工具(二)
  • LabVIEW 瀑布图与游标操作
  • Python人工智能机器学习汇总
  • MySQL 常用语法
  • CTFshow系列——命令执行web69-72
  • 贝叶斯分类(Bayes Classify)
  • 【嵌入式DIY实例】-空中鼠标
  • Ubuntu安装NVIDIA显卡驱动
  • C#基础(③CMD进程)
  • 【C2000】C2000的国产替代现状与技术关键路径
  • unity3d 中 R3 实际使用 安装方法
  • 吴恩达机器学习作业十 PCA主成分分析
  • 【量化回测】backtracker整体架构和使用示例
  • arm容器启动spring-boot端口报错
  • linux 内核 - 常见的文件系统介绍
  • 【K8s】整体认识K8s之存储--volume
  • shell脚本(略)