应优先使用 diff -u 查看差异,其中 + 行为新增、- 行为删除、空格开头行为未变;避免默认格式,注意编码、二进制、大文件及超长行的特殊处理方式。

diff 命令输出怎么看,哪些行是真正改动的
diff 默认用“正常格式”(normal format)输出,但这种格式对人不友好,容易误判增删方向。实际工作中应优先用 -u(unified)参数:它把上下文一起打出来,+ 行是新增,- 行是删除, (空格)开头的是未变行。
- 别直接跑
diff file1 file2,默认输出难读,尤其文件稍大时根本分不清谁改了谁 -
diff -u file1 file2是底线配置;加--color=always能高亮符号,终端支持时更直观 - 如果文件编码不一致(比如一个 UTF-8 一个 GBK),
diff可能整行标为不同——先用file file1 file2确认编码,必要时用iconv统一再比 -
diff -q只报“是否不同”,适合脚本判断,但不告诉你哪不同
vimdiff 打开后光标乱跳、不能编辑怎么办
vimdiff 不是图形工具,它是 vim -d 的别名,本质还是 vim,所有操作都依赖 vim 模式。新手常卡在“点了回车就退出”或“输字母没反应”,其实是忘了切换模式。
- 启动后默认是普通模式(Normal mode),按
i或a进入插入模式才能编辑;改完按Esc回到普通模式 - 左右窗口切换用
Ctrl+w+l(右)或h(左),不是鼠标点——鼠标在终端里通常无效 - 同步某一块差异:把光标移到差异块内,按
do(diff obtain)从另一侧取内容,dp(diff put)把当前侧内容推过去 - 想忽略空白差异?启动时加
-c 'set diffopt+=iwhite',或进 vim 后执行:set diffopt+=iwhite
二进制文件、超大文件、无换行文本怎么安全比对
diff 和 vimdiff 都假设文件是文本、以行为单位处理。遇到非文本内容,要么报错,要么输出不可读的乱码结果。
- 先用
file file.bin确认是不是二进制;是的话,改用cmp -l file1 file2查第一个字节差异,或xxd file1 | diff -u - 看十六进制对比 - 单个文件 >500MB 且是文本?
diff可能内存爆掉或卡死。可先用head -n 10000/tail -n 10000截片段比,或用awk 'NR==FNR{a[$0]++;next}!($0 in a)' file1 file2找独有行(要求行唯一) - 一行超长(比如 JSON 不换行)、无换行符的文件:
diff会当成单行处理,输出巨长 diff 块。建议先用jq -S . file.json > file_pretty.json格式化,再比对
如何让 diff 忽略注释、空行或特定字段
diff 本身不解析语法,所谓“忽略注释”其实是靠预处理——把要忽略的内容临时替换成统一标记,再比对。
- 去空行和纯注释(# 或 // 开头):
diff - 忽略某列(如日志时间戳):用
awk '{ $1=$2=""; print }'清掉前两列再比,但要注意字段分隔符,awk -F'\t' '{ $1="" }'更稳妥 - Git 用户注意:
git diff支持.gitattributes配置diff=javascript等驱动,但那是 Git 层的,和系统diff命令无关 - 长期高频需求建议写成小脚本封装,避免每次敲一长串管道;别硬记,用
alias diffclean='diff 容易出错,函数更可靠
真正麻烦的从来不是命令怎么敲,而是你不确定该比什么——是比原始字节、逻辑结构,还是语义等价。动手前花三十秒想清楚“我到底要确认什么”,比调半小时参数有用得多。










