Shell脚本中diff工具的使用

Written by

in

文章目录
  • 在 Linux 系统中,diff 是一个非常实用的命令行工具,用于比较两个文件或目录之间的差异。它不仅可以用于代码版本控制、日志分析,还能广泛应用于自动化脚本开发、配置文件比对、日志差异检测等场景。 本文将带你深入掌握 diff 命令的使用方法,包括: ✅ diff 的基本语法与输出解读✅ 如何比较文本文件、目录、符号链接✅ 常用参数详解(如 -r, -q, -u 等)✅ 在 Shell 脚本中结合 diff 实现自动化检测✅ 实战案例:自动检测配置文件变更、日志差异比对✅ 常见问题与解决方案 并通过完整代码示例帮助你快速上手并灵活应用 diff 工具。
  • diff(difference)是 Linux 系统中的一个命令行工具,用于逐行比较两个文件的内容差异,并输出差异内容。它广泛用于版本控制、日志分析、脚本调试等领域。
  • diff [选项] 文件1 文件2
  • 选项 含义 示例 -r 递归比较目录下的所有文件 diff -r dir1 dir2 -q 只显示文件是否不同(不显示具体差异) diff -q file1 file2 -u 显示统一格式的差异(常用于代码 diff) diff -u file1 file2 -i 忽略大小写差异 diff -i file1 file2 -w 忽略空格和制表符差异 diff -w file1 file2 -N 将缺失的文件视为空文件 diff -N dir1 dir2 -s 显示相同文件的信息 diff -s file1 file2
  • 问题 原因 解决方案 diff 输出太多 差异内容过多 使用 ` 无法比较目录 未使用 -r 参数 添加 -r 进行递归比较 文件权限不同 导致误报差异 使用 -q 忽略元信息 输出中文乱码 编码不一致 使用 iconv 转换编码 脚本中判断失败 未重定向输出 使用 > /dev/null 静默输出
  • 参数 功能 适用场景 -r 递归比较目录 比较整个配置目录 -q 仅显示是否不同 快速判断变化 -u 显示统一格式差异 代码 diff、补丁生成 -i 忽略大小写 多语言脚本对比 -w 忽略空白 避免格式差异干扰 -N 视缺失文件为空 比较新旧版本目录 -s 显示相同文件信息 日志记录用途
  • 到此这篇关于Shell脚本中diff工具的使用的文章就介绍到这了,更多相关Shell diff工具内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: shell中常用的命令之diff和patch用法 一天一个shell命令 linux文本操作系列-diff命令详解
  • 目录
    • 一、前言
    • 二、什么是 diff?
      • ✅ 主要用途:
    • 三、diff 的基本语法
      • ✅ 示例:
    • 四、diff 输出格式详解
      • ✅ 示例对比:
      • ✅ 解读:
    • 五、常用选项参数详解
      • 六、diff 在 Shell 脚本中的应用
        • ✅ 示例1:检测文件是否变化
        • ✅ 示例2:监控日志文件变化
      • 七、实战案例:自动检测配置文件变更
        • 📌 需求背景:
        • ✅ 实现脚本:
      • 八、diff 与 patch 的结合使用(高级用法)
        • ✅ 1. 生成补丁文件
        • ✅ 2. 应用补丁文件
      • 九、常见问题与解决方案
        • 十、总结对比表:diff 常用参数一览
          • 十一、结语

            在 Linux 系统中,diff 是一个非常实用的命令行工具,用于比较两个文件或目录之间的差异。它不仅可以用于代码版本控制、日志分析,还能广泛应用于自动化脚本开发、配置文件比对、日志差异检测等场景。

            本文将带你深入掌握 diff 命令的使用方法,包括:

            diff 的基本语法与输出解读
            ✅ 如何比较文本文件、目录、符号链接
            ✅ 常用参数详解(如 -r, -q, -u 等)
            ✅ 在 Shell 脚本中结合 diff 实现自动化检测
            ✅ 实战案例:自动检测配置文件变更、日志差异比对
            ✅ 常见问题与解决方案

            并通过完整代码示例帮助你快速上手并灵活应用 diff 工具。

            diff(difference)是 Linux 系统中的一个命令行工具,用于逐行比较两个文件的内容差异,并输出差异内容。它广泛用于版本控制、日志分析、脚本调试等领域。

            场景 说明
            文件版本对比 比如修改前后的代码文件
            日志分析 检查不同时间段的日志是否有异常
            自动化脚本 判断某个文件是否发生变化
            配置文件监控 检测系统配置是否被修改
            构建流程 比较构建输出目录与上一次输出的差异

            diff [选项] 文件1 文件2

            diff file1.txt file2.txt

            如果文件内容完全一致,diff 不会输出任何内容;如果有差异,会输出差异行及行号信息。

            $ cat file1.txt
            Hello World
            This is a test file.
            
            $ cat file2.txt
            Hello World
            This is a modified file.
            
            $ diff file1.txt file2.txt
            2c2
            < This is a test file.
            ---
            > This is a modified file.

            • 2c2:表示 file1 的第 2 行 需要 change 成 file2 的第 2 行
            • <:表示 file1 的内容
            • ---
            • >:表示 file2 的内容

            选项 含义 示例
            -r 递归比较目录下的所有文件 diff -r dir1 dir2
            -q 只显示文件是否不同(不显示具体差异) diff -q file1 file2
            -u 显示统一格式的差异(常用于代码 diff) diff -u file1 file2
            -i 忽略大小写差异 diff -i file1 file2
            -w 忽略空格和制表符差异 diff -w file1 file2
            -N 将缺失的文件视为空文件 diff -N dir1 dir2
            -s 显示相同文件的信息 diff -s file1 file2

            #!/bin/bash
            
            FILE1="/path/to/file1.txt"
            FILE2="/path/to/file2.txt"
            
            if ! diff -q "$FILE1" "$FILE2" > /dev/null; then
                echo "文件内容不同,发生变更!"
            else
                echo "文件内容一致。"
            fi

            #!/bin/bash
            
            LOG_FILE="/var/log/app.log"
            TMP_FILE="/tmp/app.log.bak"
            
            # 首次备份
            cp "$LOG_FILE" "$TMP_FILE"
            
            # 每隔10秒检查一次
            while true; do
                sleep 10
                if ! diff -q "$LOG_FILE" "$TMP_FILE" > /dev/null; then
                    echo "日志文件发生变化!"
                    cp "$LOG_FILE" "$TMP_FILE"
                fi
            done

            系统配置文件 /etc/app.conf 被多个用户访问,我们希望在每次配置文件发生变化时,自动记录变更内容。

            #!/bin/bash
            
            CONFIG="/etc/app.conf"
            BACKUP="/tmp/app.conf.bak"
            LOG="/var/log/app.conf.log"
            
            # 初始化备份
            if [ ! -f "$BACKUP" ]; then
                cp "$CONFIG" "$BACKUP"
                echo "初始备份已创建于 $(date)" >> "$LOG"
                exit 0
            fi
            
            # 比较差异
            if ! diff -q "$CONFIG" "$BACKUP" > /dev/null; then
                echo "检测到配置文件变化:$(date)" >> "$LOG"
                diff -u "$BACKUP" "$CONFIG" >> "$LOG"
                cp "$CONFIG" "$BACKUP"
            else
                echo "配置文件无变化。"
            fi

            你可以将该脚本加入 crontab 定时执行,实现自动化监控。

            diff -u file1.txt file2.txt > patch.diff

            patch file1.txt < patch.diff

            这种方式非常适合在服务器之间同步小范围的配置或代码修改。

            问题 原因 解决方案
            diff 输出太多 差异内容过多 使用 `
            无法比较目录 未使用 -r 参数 添加 -r 进行递归比较
            文件权限不同 导致误报差异 使用 -q 忽略元信息
            输出中文乱码 编码不一致 使用 iconv 转换编码
            脚本中判断失败 未重定向输出 使用 > /dev/null 静默输出

            参数 功能 适用场景
            -r 递归比较目录 比较整个配置目录
            -q 仅显示是否不同 快速判断变化
            -u 显示统一格式差异 代码 diff、补丁生成
            -i 忽略大小写 多语言脚本对比
            -w 忽略空白 避免格式差异干扰
            -N 视缺失文件为空 比较新旧版本目录
            -s 显示相同文件信息 日志记录用途

            到此这篇关于Shell脚本中diff工具的使用的文章就介绍到这了,更多相关Shell diff工具内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

            您可能感兴趣的文章:

            • shell中常用的命令之diff和patch用法
            • 一天一个shell命令 linux文本操作系列-diff命令详解

            站内搜索