当你在日常的 运维 工作或编写 Shell 脚本时,是否经常需要找出两个配置文件的差异、对日志条目进行排序,或是清理重复数据?Linux 系统提供了一套强大而高效的原生工具,专门应对这些场景。本文将对文件比较、排序、去重及补丁应用的核心命令进行系统梳理,并通过典型示例展示其实际用法。
一、文件比较命令
1. diff —— 逐行比较文本文件
diff 是最经典的文件差异比较工具,它逐行对比文本内容,其输出常被用来生成补丁文件,是代码版本管理(如 Git)的基础之一。
常用选项
-u:输出统一格式(unified diff),可读性更好。
-c:输出上下文格式(context diff)。
-i:比较时忽略大小写差异。
-w:忽略所有的空白字符(空格、制表符)。
-r:递归比较目录下的所有文件。
示例
# 比较两个文件,输出标准差异格式
diff file1.txt file2.txt
# 使用统一格式显示差异,并忽略所有空白字符
diff -uw file1.txt file2.txt
# 递归比较两个目录结构
diff -r dir1/ dir2/
2. cmp —— 字节级比较文件
与 diff 关注文本行不同,cmp 直接比较两个文件的每一个字节。它通常只报告第一个发现差异的位置,非常适合快速检查两个 二进制文件(如编译后的程序、镜像文件)是否完全一致。
常用选项
-l:列出所有不同字节的序号及其字节值。
-s:静默模式,不输出任何信息,仅通过命令的退出状态码来判断(0 表示相同,1 表示不同)。
示例
# 比较两个二进制文件,输出第一个不同字节的位置
cmp file1.bin file2.bin
# 列出两个文件所有不同的字节
cmp -l file1.bin file2.bin
# 静默比较,通过shell逻辑判断
cmp -s file1.txt file2.txt && echo “文件相同” || echo “文件不同”
3. comm —— 逐行比较两个已排序文件
comm 命令要求输入文件必须是预先排序好的。它逐行比较后,会输出三列结果:
- 第一列:仅出现在第一个文件中的行。
- 第二列:仅出现在第二个文件中的行。
- 第三列:两个文件中都存在的行。
示例
# 首先对两个列表文件进行排序
sort list1.txt > list1.sorted
sort list2.txt > list2.sorted
# 比较并显示三列结果
comm list1.sorted list2.sorted
# 只显示两个文件共有的行(通过 -12 隐藏第一、第二列)
comm -12 list1.sorted list2.sorted
4. diff3 —— 三路文件比较
此命令用于比较三个文件,常见于代码合并时分析“我方版本”、“原始基础版本”和“对方版本”之间的差异,是理解合并冲突的基础工具。
示例
diff3 my_version.txt base_version.txt their_version.txt
5. sdiff —— 并排显示差异
sdiff 以左右并列的格式展示两个文件的差异,便于直观对比。它还可以进入交互模式,让你选择如何合并差异。
示例
# 指定输出宽度为80个字符进行并排比较
sdiff -w 80 file1.txt file2.txt
6. 图形化或增强工具
对于习惯GUI操作或需要更直观对比的场景,可以考虑以下工具:
vimdiff:在 Vim 编辑器内高亮对比文件,适合开发者。
meld / kdiff3:功能强大的图形化比较与合并工具。
colordiff:为 diff 命令的输出着色,提升可读性。
二、文件排序与去重命令
1. sort —— 排序文本行
sort 命令用于对文本文件的行进行排序,默认按照字典序(ASCII顺序)排列。它是处理数据、准备分析的前置步骤。
常用选项
-n:按数值大小进行排序,而非字符串。
-r:逆序排序(从大到小或从Z到A)。
-k:指定根据哪一列(字段)进行排序。
-t:指定字段的分隔符(默认为空白字符)。
-u:排序后移除重复行,等效于 sort | uniq。
-o:将排序结果直接写入指定文件(可覆盖原文件)。
示例
# 按字典序排序一个名字列表
sort names.txt
# 按数值大小排序一个数字文件
sort -n numbers.txt
# 按第二列(以冒号为分隔符)排序 /etc/passwd 文件
sort -t':' -k2 /etc/passwd
# 对文件内容排序并去重,然后保存到新文件
sort -u input.txt > output.txt
2. uniq —— 报告或删除重复行
uniq 通常需要与 sort 命令搭配使用,因为它只能检测并处理相邻的重复行。它可以用来统计重复次数、筛选唯一行或重复行。
常用选项
-c:在每行前显示该行重复出现的次数。
-d:仅输出重复出现的行。
-u:仅输出没有重复出现的行(唯一行)。
-i:忽略大小写进行重复项判断。
示例
# 先排序,再去重(标准流程)
sort words.txt | uniq
# 统计每个单词在文件中出现的频率
sort words.txt | uniq -c
# 找出文件中所有重复的单词
sort words.txt | uniq -d
三、补丁应用命令
patch —— 应用补丁文件
patch 命令用于将 diff 生成的补丁文件应用到原始文件上,是软件更新、代码协作中手动打补丁的标准方式。
示例
# 首先,使用 diff 生成统一格式的补丁文件
diff -u original.txt modified.txt > change.patch
# 将补丁应用到原始文件
patch original.txt < change.patch
# 如果需要撤销这次补丁(回滚)
patch -R original.txt < change.patch
四、其他相关命令
除了上述核心命令,还有一些工具在特定场景下非常有用:
总结与快速参考
| 功能类别 |
常用命令 |
主要用途 |
| 文本比较 |
diff, sdiff, vimdiff |
逐行比较文本文件,查看修改内容。 |
| 二进制比较 |
cmp |
字节级比较,快速判断文件是否一致。 |
| 排序 |
sort |
对文件内容按行排序(数值、字典序等)。 |
| 去重 |
uniq |
去除已排序文件中的重复行,可计数。 |
| 补丁应用 |
patch |
应用 diff 生成的补丁文件来更新文件。 |
| 快速校验 |
md5sum, sha256sum |
通过哈希值校验文件完整性或是否相同。 |
掌握这些命令并理解其适用场景,能让你在Linux环境下处理文件比对、数据整理等任务时游刃有余。如果你在实践中遇到了更复杂的文本处理难题,不妨来 云栈社区 与更多开发者交流探讨,分享你的脚本技巧。