Shell脚本中diff工具的使用
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、前言</a></li><li><a href="#_label1">二、什么是 diff?</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">✅ 主要用途:</a></li></ul><li><a href="#_label2">三、diff 的基本语法</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_1">✅ 示例:</a></li></ul><li><a href="#_label3">四、diff 输出格式详解</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_2">✅ 示例对比:</a></li><li><a href="#_lab2_3_3">✅ 解读:</a></li></ul><li><a href="#_label4">五、常用选项参数详解</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">六、diff 在 Shell 脚本中的应用</a></li><ul class="second_class_ul"><li><a href="#_lab2_5_4">✅ 示例1:检测文件是否变化</a></li><li><a href="#_lab2_5_5">✅ 示例2:监控日志文件变化</a></li></ul><li><a href="#_label6">七、实战案例:自动检测配置文件变更</a></li><ul class="second_class_ul"><li><a href="#_lab2_6_6">📌 需求背景:</a></li><li><a href="#_lab2_6_7">✅ 实现脚本:</a></li></ul><li><a href="#_label7">八、diff 与 patch 的结合使用(高级用法)</a></li><ul class="second_class_ul"><li><a href="#_lab2_7_8">✅ 1. 生成补丁文件</a></li><li><a href="#_lab2_7_9">✅ 2. 应用补丁文件</a></li></ul><li><a href="#_label8">九、常见问题与解决方案</a></li><ul class="second_class_ul"></ul><li><a href="#_label9">十、总结对比表:diff 常用参数一览</a></li><ul class="second_class_ul"></ul><li><a href="#_label10">十一、结语</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一、前言</h2><p>在 Linux 系统中,<code>diff</code> 是一个非常实用的命令行工具,用于<strong>比较两个文件或目录之间的差异</strong>。它不仅可以用于代码版本控制、日志分析,还能广泛应用于自动化脚本开发、配置文件比对、日志差异检测等场景。</p>
<blockquote><p>本文将带你深入掌握 diff 命令的使用方法,包括:</p></blockquote>
<p>✅ <code>diff</code> 的基本语法与输出解读<br />✅ 如何比较文本文件、目录、符号链接<br />✅ 常用参数详解(如 <code>-r</code>, <code>-q</code>, <code>-u</code> 等)<br />✅ 在 Shell 脚本中结合 <code>diff</code> 实现自动化检测<br />✅ 实战案例:自动检测配置文件变更、日志差异比对<br />✅ 常见问题与解决方案</p>
<p>并通过完整代码示例帮助你快速上手并灵活应用 <code>diff</code> 工具。</p>
<p class="maodian"><a name="_label1"></a></p><h2>二、什么是 diff?</h2>
<p><code>diff</code>(difference)是 Linux 系统中的一个命令行工具,用于<strong>逐行比较两个文件的内容差异</strong>,并输出差异内容。它广泛用于版本控制、日志分析、脚本调试等领域。</p>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>✅ 主要用途:</h3>
<table><thead><tr><th>场景</th><th>说明</th></tr></thead><tbody><tr><td>文件版本对比</td><td>比如修改前后的代码文件</td></tr><tr><td>日志分析</td><td>检查不同时间段的日志是否有异常</td></tr><tr><td>自动化脚本</td><td>判断某个文件是否发生变化</td></tr><tr><td>配置文件监控</td><td>检测系统配置是否被修改</td></tr><tr><td>构建流程</td><td>比较构建输出目录与上一次输出的差异</td></tr></tbody></table>
<p class="maodian"><a name="_label2"></a></p><h2>三、diff 的基本语法</h2>
<div class="jb51code"><pre class="brush:bash;">diff [选项] 文件1 文件2</pre></div>
<p class="maodian"><a name="_lab2_2_1"></a></p><h3>✅ 示例:</h3>
<div class="jb51code"><pre class="brush:bash;">diff file1.txt file2.txt</pre></div>
<p>如果文件内容完全一致,<code>diff</code> 不会输出任何内容;如果有差异,会输出差异行及行号信息。</p>
<p class="maodian"><a name="_label3"></a></p><h2>四、diff 输出格式详解</h2>
<p class="maodian"><a name="_lab2_3_2"></a></p><h3>✅ 示例对比:</h3>
<div class="jb51code"><pre class="brush:bash;">$ 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.</pre></div>
<p class="maodian"><a name="_lab2_3_3"></a></p><h3>✅ 解读:</h3>
<ul><li><code>2c2</code>:表示 <strong>file1 的第 2 行</strong> 需要 <strong>change</strong> 成 <strong>file2 的第 2 行</strong></li><li><code><</code>:表示 file1 的内容</li><li><code>---</code></li><li><code>></code>:表示 file2 的内容</li></ul>
<p class="maodian"><a name="_label4"></a></p><h2>五、常用选项参数详解</h2>
<table><thead><tr><th>选项</th><th>含义</th><th>示例</th></tr></thead><tbody><tr><td>-r</td><td>递归比较目录下的所有文件</td><td>diff -r dir1 dir2</td></tr><tr><td>-q</td><td>只显示文件是否不同(不显示具体差异)</td><td>diff -q file1 file2</td></tr><tr><td>-u</td><td>显示统一格式的差异(常用于代码 diff)</td><td>diff -u file1 file2</td></tr><tr><td>-i</td><td>忽略大小写差异</td><td>diff -i file1 file2</td></tr><tr><td>-w</td><td>忽略空格和制表符差异</td><td>diff -w file1 file2</td></tr><tr><td>-N</td><td>将缺失的文件视为空文件</td><td>diff -N dir1 dir2</td></tr><tr><td>-s</td><td>显示相同文件的信息</td><td>diff -s file1 file2</td></tr></tbody></table>
<p class="maodian"><a name="_label5"></a></p><h2>六、diff 在 Shell 脚本中的应用</h2>
<p class="maodian"><a name="_lab2_5_4"></a></p><h3>✅ 示例1:检测文件是否变化</h3>
<div class="jb51code"><pre class="brush:bash;">#!/bin/bash
FILE1="/path/to/file1.txt"
FILE2="/path/to/file2.txt"
if ! diff -q "$FILE1" "$FILE2" > /dev/null; then
echo "文件内容不同,发生变更!"
else
echo "文件内容一致。"
fi</pre></div>
<p class="maodian"><a name="_lab2_5_5"></a></p><h3>✅ 示例2:监控日志文件变化</h3>
<div class="jb51code"><pre class="brush:bash;">#!/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</pre></div>
<p class="maodian"><a name="_label6"></a></p><h2>七、实战案例:自动检测配置文件变更</h2>
<p class="maodian"><a name="_lab2_6_6"></a></p><h3>📌 需求背景:</h3>
<p>系统配置文件 <code>/etc/app.conf</code> 被多个用户访问,我们希望在每次配置文件发生变化时,自动记录变更内容。</p>
<p class="maodian"><a name="_lab2_6_7"></a></p><h3>✅ 实现脚本:</h3>
<div class="jb51code"><pre class="brush:bash;">#!/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</pre></div>
<p>你可以将该脚本加入 <code>crontab</code> 定时执行,实现自动化监控。</p>
<p class="maodian"><a name="_label7"></a></p><h2>八、diff 与 patch 的结合使用(高级用法)</h2>
<p class="maodian"><a name="_lab2_7_8"></a></p><h3>✅ 1. 生成补丁文件</h3>
<div class="jb51code"><pre class="brush:bash;">diff -u file1.txt file2.txt > patch.diff</pre></div>
<p class="maodian"><a name="_lab2_7_9"></a></p><h3>✅ 2. 应用补丁文件</h3>
<div class="jb51code"><pre class="brush:bash;">patch file1.txt < patch.diff</pre></div>
<p>这种方式非常适合在服务器之间同步小范围的配置或代码修改。</p>
<p class="maodian"><a name="_label8"></a></p><h2>九、常见问题与解决方案</h2>
<table><thead><tr><th>问题</th><th>原因</th><th>解决方案</th></tr></thead><tbody><tr><td>diff 输出太多</td><td>差异内容过多</td><td>使用 `</td></tr><tr><td>无法比较目录</td><td>未使用 <code>-r</code> 参数</td><td>添加 <code>-r</code> 进行递归比较</td></tr><tr><td>文件权限不同</td><td>导致误报差异</td><td>使用 <code>-q</code> 忽略元信息</td></tr><tr><td>输出中文乱码</td><td>编码不一致</td><td>使用 <code>iconv</code> 转换编码</td></tr><tr><td>脚本中判断失败</td><td>未重定向输出</td><td>使用 <code>> /dev/null</code> 静默输出</td></tr></tbody></table>
<p class="maodian"><a name="_label9"></a></p><h2>十、总结对比表:diff 常用参数一览</h2>
<table><thead><tr><th>参数</th><th>功能</th><th>适用场景</th></tr></thead><tbody><tr><td>-r</td><td>递归比较目录</td><td>比较整个配置目录</td></tr><tr><td>-q</td><td>仅显示是否不同</td><td>快速判断变化</td></tr><tr><td>-u</td><td>显示统一格式差异</td><td>代码 diff、补丁生成</td></tr><tr><td>-i</td><td>忽略大小写</td><td>多语言脚本对比</td></tr><tr><td>-w</td><td>忽略空白</td><td>避免格式差异干扰</td></tr><tr><td>-N</td><td>视缺失文件为空</td><td>比较新旧版本目录</td></tr><tr><td>-s</td><td>显示相同文件信息</td><td>日志记录用途</td></tr></tbody></table>
<p class="maodian"><a name="_label10"></a></p><h2>十一、结语</h2>
頁:
[1]