linux shell

关注公众号 jb51net

关闭
首页 > 脚本专栏 > linux shell > Shell diff工具

Shell脚本中diff工具的使用

作者:咖啡の猫

diff是一个非常实用的命令行工具,用于比较两个文件或目录之间的差异,本文就来介绍一下Shell脚本中diff工具的使用,感兴趣的可以了解一下

一、前言

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

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

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

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

二、什么是 diff?

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

✅ 主要用途:

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

三、diff 的基本语法

diff [选项] 文件1 文件2

✅ 示例:

diff file1.txt file2.txt

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

四、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.

✅ 解读:

五、常用选项参数详解

选项含义示例
-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 在 Shell 脚本中的应用

✅ 示例1:检测文件是否变化

#!/bin/bash

FILE1="/path/to/file1.txt"
FILE2="/path/to/file2.txt"

if ! diff -q "$FILE1" "$FILE2" > /dev/null; then
    echo "文件内容不同,发生变更!"
else
    echo "文件内容一致。"
fi

✅ 示例2:监控日志文件变化

#!/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 与 patch 的结合使用(高级用法)

✅ 1. 生成补丁文件

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

✅ 2. 应用补丁文件

patch file1.txt < patch.diff

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

九、常见问题与解决方案

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

十、总结对比表:diff 常用参数一览

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

十一、结语

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

您可能感兴趣的文章:
阅读全文