Shell命令-文件及内容处理之diff、vimdiff
文件及内容处理 - diff、vimdiff
1. diff:比较两个文件区别
diff命令的功能说明
diff命令用比较文件的差异。diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。
diff命令的语法格式
diff[-abBcdefHilnNpPqrstTuvwy][-][-C ][-D ][-I ][-S ][-W ][-x ][-X ][--help][--left-column][--suppress-common-line][文件或目录1][文件或目录2]
diff[参数选项] [两个文件]
diff命令的选项说明
diff选项很多,但是用的不多,表1为diff命令的参数及说明:
表1:
diff命令的参数及说明
| 参数选项 | 解释说明 |
|---|---|
| - | 指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。 |
| -a或--text | diff预设只会逐行比较文本文件。 |
| -b或--ignore-space-change | 不检查空格字符的不同。 |
| -B或--ignore-blank-lines | 不检查空白行。 |
| -c | 显示全部内文,并标出不同之处。 |
| -C或--context | 与执行"-c-"指令相同。 |
| -d或--minimal | 使用不同的演算法,以较小的单位来做比较。 |
| -D或ifdef | 此参数的输出格式可用于前置处理器巨集。 |
| -e或--ed | 此参数的输出格式可用于ed的script文件。 |
| -f或-forward-ed | 输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处。 |
| -H或--speed-large-files | 比较大文件时,可加快速度。 |
| -l或--ignore-matching-lines | 若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。 |
| -i或--ignore-case | 不检查大小写的不同。 |
| -l或--paginate | 将结果交由pr程序来分页。 |
| -n或--rcs | 将比较结果以RCS的格式来显示。 |
| -N或--new-file | 在比较目录时,若文件A仅出现在某个目录中,预设会显示: |
| Only in目录 | 文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。 |
| -p | 若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。 |
| -P或--unidirectional-new-file | 与-N类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。 |
| -q或--brief | 仅显示有无差异,不显示详细的信息。 |
| -r或--recursive | 比较子目录中的文件。 |
| -s或--report-identical-files | 若没有发现任何差异,仍然显示信息。 |
| -S或--starting-file | 在比较目录时,从指定的文件开始比较。 |
| -t或--expand-tabs | 在输出时,将tab字符展开。 |
| -T或--initial-tab | 在每行前面加上tab字符以便对齐。 |
| -u,-U或--unified= | 以合并的方式来显示文件内容的不同。 |
| -v或--version | 显示版本信息。 |
| -w或--ignore-all-space | 忽略全部的空格字符。 |
| -W或--width | 在使用-y参数时,指定栏宽。 |
| -x或--exclude | 不比较选项中所指定的文件或目录。 |
| -X或--exclude-from | 您可以将文件或目录类型存成文本文件,然后在=中指定此文本文件。 |
| -y或--side-by-side | 以并列的方式显示文件的异同之处。 |
| --help | 显示帮助。 |
| --left-column | 在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。 |
| --suppress-common-lines | 在使用-y参数时,仅显示不同之处。 |
diff命令的实践操作
范例1: 备份
/etc/passwd,然后修改源文件,然后通过diff命令进行比较
--------------------------------------------------------------
==>备份/etc/passwd<==
--------------------------------------------------------------
[root@oldboyedu ~]# cp /etc/passwd{,.ori}
--------------------------------------------------------------
==>源文件/etc/passwd添加内容<==
---------------------------------------------------------------
[root@oldboyedu ~]# echo 'test' >> /etc/passwd
--------------------------------------------------------------
==>查看/etc/passwd添加的内容<==
--------------------------------------------------------------
[root@oldboyedu ~]# tail -1 /etc/passwd
test
--------------------------------------------------------------
==>比较不同(也可以将两个文件分开写,要有空格)<==
--------------------------------------------------------------
[root@oldboyedu ~]# diff /etc/passwd{,.ori}
25d24
< test
--------------------------------------------------------------
==>25行有新加的test<==
--------------------------------------------------------------
[root@oldboyedu ~]# grep -n -B3 'test' /etc/passwd
22-tcpdump:x:72:72::/:/sbin/nologin
23-nginx:x:1001:1001::/home/nginx:/sbin/nologin
24-ntp:x:38:38::/etc/ntp:/sbin/nologin
25:test
--------------------------------------------------------------
==>24行后,无内容,(过滤的内容实际而定)<==
--------------------------------------------------------------
[root@oldboyedu ~]# grep -n -A10 'tcpdump' /etc/passwd.ori
22:tcpdump:x:72:72::/:/sbin/nologin
23-nginx:x:1001:1001::/home/nginx:/sbin/nologin
24-ntp:x:38:38::/etc/ntp:/sbin/nologin
范例2: 并排格式输出
--------------------------------------------------------------
==>创建演示文本<==
--------------------------------------------------------------
[root@web01 /test]# seq -w 10 >oldboy.txt
[root@web01 /test]# cat oldboy.txt
01
02
03
04
05
06
07
08
09
10
--------------------------------------------------------------
==>备份源文件<==
--------------------------------------------------------------
[root@web01 /test]# cp oldboy.txt{,.ori}
[root@web01 /test]# cat oldboy.txt.ori
01
02
03
04
05
06
07
08
09
10
--------------------------------------------------------------
==>往源文件追加内容<==
--------------------------------------------------------------
[root@web01 /test]# echo 521 >> oldboy.txt
--------------------------------------------------------------
==>并排格式输出<==
--------------------------------------------------------------
[root@web01 /test]# diff oldboy.txt{,.ori} -y -W 50
01 01
02 02
03 03
04 04
05 05
06 06
07 07
08 08
09 09
10 10
521 <
说明:
|表示前后2个文件内容有不同<表示后面文件比前面文件少了1行内容>表示后面文件比前面文件多了1行内容
2. vimdiff:快速比较和合并少量文件
vimdiff命令的功能说明
纯文本文件比较和合并工具一直是软件开发过程中比较重要的组成部分,
vimdiff能够在比较出来的多处差异之间快速定位,很容易的进行文件合并操作。在需要快速比较和合并少量文件的时候,vimdiff是很好的选择。首先保证系统中的diff命令是可用的。Vim的diff模式是依赖于diff命令的。
vimdiff命令的语法格式
vimdiff[options] file1 file2 [file3 [file4]]
vimdiff[参数选项] [两个文件]
vimdiff命令的选项说明
vimdiff用的不多,这里就省略了
vimdiff命令的实践操作
范例1: 备份
/etc/passwd,然后修改源文件,然后通过vimdiff命令进行比较
使用
vimdiff效果如下图所示:(vimdiff /etc/passwd /etc/passwd.ori)

从上图我们可以看到一个清晰的比较结果。屏幕被垂直分割,左右两侧分别显示被比较的两个文件。两个文件中连续的相同的行被折叠了起来,以便使用者能把注意力集中在两个文件的差异上。只在某一文件中存在的行的背景色被设置为蓝色,而在另一文件中的对应位置被显示为绿色。两个文件中都存在,但是包含差异的行显示为粉色背景,引起差异的文字用红色背景加以突出。
如果希望交换两个窗口的位置,或者希望改变窗口的分割方式,可以使用下列命令:
Ctrl-w K(把当前窗口移到最上边)Ctrl-w H(把当前窗口移到最左边)Ctrl-w J(把当前窗口移到最下边)Ctrl-w L(把当前窗口移到最右边)其中1和3两个操作会把窗口改成水平分割方式。
光标移动
接下来试试在行间移动光标,可以看到左右两侧的屏幕滚动是同步的。这是因为
scrollbind选项被设置了的结果,vimdiff会尽力保证两侧文件的对齐。如果不想要这个特性,可以设置:
:set noscrollbind
可以使用快捷键在各个差异点之间快速移动。跳转到下一个差异点:
]c
反向跳转是:
[c
如果在命令前加上数字的话,可以跳过一个或数个差异点,从而实现跳的更远。比如如果在位于第一个差异点的行输入
2]c,将越过下一个差异点,跳转到第三个差异点。
文件合并
文件比较的最终目的之一就是合并,以消除差异。如果希望把一个差异点中当前文件的内容复制到另一个文件里,可以使用命令
dp (diff "put")
如果希望把另一个文件的内容复制到当前行中,可以使用命令
do (diff "get",之所以不用dg,是因为dg已经被另一个命令占用了)
如果希望手工修改某一行,可以使用通常的
vimdiff操作。如果希望在两个文件之间来回跳转,可以用下列命令序列:
Ctrl-w, w
在修改一个或两个文件之后,
vimdiff会试图自动来重新比较文件,来实时反映比较结果。但是也会有处理失败的情况,这个时候需要手工来刷新比较结果:
:diffupdate
如果希望撤销修改,可以和平常用
vim编辑一样,直接
<ESC>, u
同时操作两个文件
在比较和合并告一段落之后,可以用下列命令对两个文件同时进行操作。比如同时退出:
:qa (quit all)
如果希望保存全部文件:
:wa (write all)
或者是两者的合并命令,保存全部文件,然后退出:
:wqa (write, then quit all)
如果在退出的时候不希望保存任何操作的结果:
:qa! (force to quit all)
上下文的展开和查看
比较和合并文件的时候经常需要结合上下文来确定最终要采取的操作。
Vimdiff缺省是会把不同之处上下各 6 行的文本都显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数,可以这样设置:
:set diffopt=context:3
可以用简单的折叠命令来临时展开被折叠的相同的文本行:
zo (folding open,之所以用z这个字母,是因为它看上去比较像折叠着的纸)
然后可以用下列命令来重新折叠:
zc (folding close)
下图是设置上下文为 3 行,并展开了部分相同文本的
vimdiff屏幕:

结论
在无法使用图形化的比较工具的时候,或者在需要快速比较和合并少量文件的时候,
vimdiff是最好的选择。
今天就写到这里,有什么疑问或出现什么错误,随时欢迎大神们发表评论指点迷津
Shell命令-文件及内容处理之diff、vimdiff的更多相关文章
- Shell命令-文件及内容处理之more、less
文件及内容处理 - more.less 1. more:分页显示文件内容 more命令的功能说明 more 命令类似 cat,不过会以一页一页的形式显示,更方便使用者逐页阅读,而最基本的指令就是按空白 ...
- Shell命令-文件及内容处理之cat、tac
文件及内容处理 - cat.tac 1. cat:显示文件内容 cat命令的功能说明 cat命令用于连接多个文件并且打印到屏幕输出或重定向到指定文件中 cat命令的语法格式 cat [OPTION]. ...
- Shell命令-文件及内容处理之head、tail
文件及内容处理 - head.tail 1. head:显示文件内容头部 head命令的功能说明 head 命令用于显示文件头部内容,默认执行 head 命令会输出文件开头的 10 行. head命令 ...
- Shell命令-文件及内容处理之cut、rev
文件及内容处理 - cut.rev 1. cut:切割文件内容 cut命令的功能说明 cut 命令用于显示每行从开头算起num1 到 num2 的文字. cut命令的语法格式 cut [OPTION] ...
- Shell命令-文件及内容处理之wc,tr
文件及内容处理 - wc.tr 1. wc:统计文件的行数.单词数或字节数 wc命令的功能说明 wc 命令用于计算字数.利用 wc 指令我们可以计算文件的字节数,字数,或是列数,若不指定文件名称,或是 ...
- Shell命令-文件及内容处理之vi、vim
文件及内容处理 - vi.vim 1.Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器 ...
- Shell命令-文件及内容处理之grep(egrep)、join
文件及内容处理 - grep(egrep).join 1. grep(egrep):文本过滤工具 grep(egrep)命令的功能说明 grep命令是Linux系统中最重要的命令之一,其功能是从文本文 ...
- Shell命令-文件及内容处理之split、paste
文件及内容处理 - split.paste 1. split:分割文件为不同的小片段 split命令的功能说明 split 命令用于将一个文件分割成数个.该指令将大文件分割成较小的文件,在默认情况下将 ...
- Shell命令-文件及内容处理之sort、uniq
文件及内容处理 - sort.unip 1. sort:对文件的文本内容排序 sort命令的功能说明 sort 命令用于将文本文件内容加以排序.sort 可针对文本文件的内容,以行为单位来排序. so ...
随机推荐
- nginx系列4:日志管理
日志切割 如果使用默认日志配置,经过一段时间运行后,access.log和error.log文件会变得非常大,使维护和排查问题变得不便,所以非常有必要做日志切割. 通常的思路是:使用nginx的-s ...
- 多线程(3)ThreadPool
使用Thread类已经可以创建并启动线程了,但是随着开启的线程越来越多,线程的创建和终止都需要手动操作,非常繁琐,另一个问题是,开启更多新的线程但是没有用的线程没有及时得到终止的时候,会占用越来越多的 ...
- 一句话总结kNN算法
一句话总结kNN算法 核心:模板匹配,将样本分到离它最相似的样本所属的类. kNN算法本质上使用了模板匹配的思想.要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出和该样本最接近的k个样本 ...
- Dynamics 365-ExecuteWorkflowRequest
一般是通过对CRM上的数据进行手动操作,来触发Workflow,但是如果碰到数据量比较大的时候,纯手动操作无疑是一个耗时费力的事.这个时候,可以通过使用ExecuteWorkflowRequest来实 ...
- 从.Net到Java学习第十二篇——SpringBoot+JPA提供跨域接口
从.Net到Java学习系列目录 最近又撸了半个月的前端代码,做app离线存储,然后又花了一周去将过去的wcf项目转webapi,java又被落下了,总感觉我特么像斗地主中的癞子牌,变来变去..... ...
- 动态BGP和静态BGP的含义与区别
1.在华为云上选购虚拟机时,会让用户选择动态BGP还是静态BGP, 全动态BGP可根据设定的寻路协议第一时间自动优化网络结构,以保持客户使用的网络持续稳定.高效. 静态BGP中的网络结构发生变化,运营 ...
- Android开发如何轻松实现基于Tesseract的Android OCR应用程序
介绍 此应用程序使用Tesseract 3的Tesseract OCR引擎,该引擎通过识别字符模式( https://github.com/tesseract-ocr/tesseract )来工作. ...
- 在phpstudy中安装并使用ThinkPHP 5
最近在慕课网学习 thinkphp,由于教师使用的是 MAC下的 MAMP 环境,而我使用的是 win7 的 phpstudy,区别不大,记录在这里,方便查询. 不同系统集成环境安装: m ...
- 测者的性能测试手册:Web压力测试工具webbench
webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统:Linux 2.编译安装: wget http:/ ...
- Web应用安全测试
偷偷挪用人家的分享: https://blog.csdn.net/aojie80/article/details/43836521 写的很棒 Burp Suite 介绍 https://blog.cs ...