找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1989

积分

0

好友

263

主题
发表于 3 天前 | 查看: 18| 回复: 0

当你在日常的 运维 工作或编写 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

四、其他相关命令

除了上述核心命令,还有一些工具在特定场景下非常有用:

  • 校验和工具md5sum / sha256sum,通过计算文件的哈希值来快速判断文件内容是否相同,尤其适合大文件或二进制文件。
    md5sum file1 file2  # 比较两个文件的MD5值
  • 同步工具rsync 在同步目录时,使用 -i--itemize-changes 选项可以详细显示哪些文件将被更新(即存在差异)。
  • 版本控制:如果文件处于 Git 仓库中,git diff 是查看工作区、暂存区或历史版本间差异的更佳选择。

总结与快速参考

功能类别 常用命令 主要用途
文本比较 diff, sdiff, vimdiff 逐行比较文本文件,查看修改内容。
二进制比较 cmp 字节级比较,快速判断文件是否一致。
排序 sort 对文件内容按行排序(数值、字典序等)。
去重 uniq 去除已排序文件中的重复行,可计数。
补丁应用 patch 应用 diff 生成的补丁文件来更新文件。
快速校验 md5sum, sha256sum 通过哈希值校验文件完整性或是否相同。

掌握这些命令并理解其适用场景,能让你在Linux环境下处理文件比对、数据整理等任务时游刃有余。如果你在实践中遇到了更复杂的文本处理难题,不妨来 云栈社区 与更多开发者交流探讨,分享你的脚本技巧。




上一篇:OpenClaw企业级部署实战:非技术CEO如何通过上下文工程驱动收入增长87%
下一篇:通用Agent演进三阶段:技术瓶颈分析与十亿日活破局路径
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-10 11:07 , Processed in 0.578472 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表