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<==
--------------------------------------------------------------
[[email protected]  ~]# cp /etc/passwd{,.ori}

--------------------------------------------------------------
==>源文件/etc/passwd添加内容<==
---------------------------------------------------------------
[[email protected]  ~]# echo 'test' >> /etc/passwd

--------------------------------------------------------------
==>查看/etc/passwd添加的内容<==
--------------------------------------------------------------
[[email protected]  ~]# tail -1 /etc/passwd
test

--------------------------------------------------------------
==>比较不同(也可以将两个文件分开写,要有空格)<==
--------------------------------------------------------------
[[email protected]  ~]# diff /etc/passwd{,.ori}
25d24
< test

--------------------------------------------------------------
==>25行有新加的test<==
--------------------------------------------------------------
[[email protected]  ~]# 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行后,无内容,(过滤的内容实际而定)<==
--------------------------------------------------------------
[[email protected]  ~]# 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: 并排格式输出

--------------------------------------------------------------
==>创建演示文本<==
--------------------------------------------------------------
[[email protected] /test]# seq -w 10 >oldboy.txt
[[email protected] /test]# cat oldboy.txt
01
02
03
04
05
06
07
08
09
10

--------------------------------------------------------------
==>备份源文件<==
--------------------------------------------------------------
[[email protected] /test]# cp oldboy.txt{,.ori}
[[email protected] /test]# cat oldboy.txt.ori
01
02
03
04
05
06
07
08
09
10

--------------------------------------------------------------
==>往源文件追加内容<==
--------------------------------------------------------------
[[email protected] /test]# echo 521 >> oldboy.txt

--------------------------------------------------------------
==>并排格式输出<==
--------------------------------------------------------------
[[email protected] /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 命令是可用的。Vimdiff 模式是依赖于 diff 命令的。

vimdiff命令的语法格式

vimdiff [options] file1 file2 [file3 [file4]]
vimdiff [参数选项] [两个文件]

vimdiff命令的选项说明

vimdiff 用的不多,这里就省略了

vimdiff命令的实践操作

范例1: 备份 /etc/passwd,然后修改源文件,然后通过 vimdiff 命令进行比较

使用vimdiff效果如下图所示:(vimdiff /etc/passwd /etc/passwd.ori)

从上图我们可以看到一个清晰的比较结果。屏幕被垂直分割,左右两侧分别显示被比较的两个文件。两个文件中连续的相同的行被折叠了起来,以便使用者能把注意力集中在两个文件的差异上。只在某一文件中存在的行的背景色被设置为蓝色,而在另一文件中的对应位置被显示为绿色。两个文件中都存在,但是包含差异的行显示为粉色背景,引起差异的文字用红色背景加以突出。

如果希望交换两个窗口的位置,或者希望改变窗口的分割方式,可以使用下列命令:

  1. Ctrl-w K(把当前窗口移到最上边)
  2. Ctrl-w H(把当前窗口移到最左边)
  3. Ctrl-w J(把当前窗口移到最下边)
  4. 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 是最好的选择。

今天就写到这里,有什么疑问或出现什么错误,随时欢迎大神们发表评论指点迷津

原文地址:https://www.cnblogs.com/wjcLinux/p/10710007.html

时间: 2024-08-13 07:02:52

Shell命令-文件及内容处理之diff、vimdiff的相关文章

Shell命令-文件及内容处理之more、less

文件及内容处理 - more.less 1. more:分页显示文件内容 more命令的功能说明 more 命令类似 cat,不过会以一页一页的形式显示,更方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能(与 vi 相似),使用中的说明文件,请按 h . more命令的语法格式 more [-dlfpcsu] [-num] [+/pattern] [+linenum] [fileNames..]more [

Shell命令-文件及内容处理之cut、rev

文件及内容处理 - cut.rev 1. cut:切割文件内容 cut命令的功能说明 cut 命令用于显示每行从开头算起num1 到 num2 的文字. cut命令的语法格式 cut [OPTION]... [FILE]... cut [选项] [文件] cut命令的使用说明 cut 命令从文件的每一行剪切字节.字符和字段并将这些字节.字符和字段写至标准输出.如果不指定 File 参数,cut 命令将读取标准输入.必须指定 -b.-c 或 -f 标志之一. cut命令的选项说明 cut 参数有几

Shell命令-文件及内容处理之cat、tac

文件及内容处理 - cat.tac 1. cat:显示文件内容 cat命令的功能说明 cat命令用于连接多个文件并且打印到屏幕输出或重定向到指定文件中 cat命令的语法格式 cat [OPTION]... [FILE]...cat [-AbeEnstTuv] [--help] [--version] fileName file命令的选项说明 cat 参数很多,但用到的就几个.表1为 cat 命令的参数及说明: 表1: cat命令的参数及说明 参数选项 解释说明 -n 或 --number 由 1

Shell命令-文件及内容处理之wc,tr

文件及内容处理 - wc.tr 1. wc:统计文件的行数.单词数或字节数 wc命令的功能说明 wc 命令用于计算字数.利用 wc 指令我们可以计算文件的字节数,字数,或是列数,若不指定文件名称,或是所给予的文件名为 " - ",则 wc 指令会从标准输入设备读取数据. wc命令的语法格式 wc [OPTION]... [FILE]... wc [-clw] [ - help] [ - version] [文件...] wc命令的选项说明 wc 选项用的不多,表1为 wc 命令的参数及

Shell命令-文件及内容处理之vi、vim

文件及内容处理 - vi.vim 1.Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计. 2.什么是 vim? Vim 是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用. 简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可

Shell命令-文件及内容处理之head、tail

文件及内容处理 - head.tail 1. head:显示文件内容头部 head命令的功能说明 head 命令用于显示文件头部内容,默认执行 head 命令会输出文件开头的 10 行. head命令的语法格式 head [OPTION]... [FILE]...head [选项] [文件] head命令的选项说明 head 参数用到的很少.表1为 head 命令的参数及说明: 表1: head命令的参数及说明 参数选项 解释说明 -n<行数> 指点显示的行数 -c<字节> 指点显

Shell命令-文件及内容处理之sort、uniq

文件及内容处理 - sort.unip 1. sort:对文件的文本内容排序 sort命令的功能说明 sort 命令用于将文本文件内容加以排序.sort 可针对文本文件的内容,以行为单位来排序. sort命令的语法格式 sort [OPTION]... [FILE]... sort [-bcdfimMnr][-o][-t][+-][--help][--verison][文件] sort命令的常用参数说明: split 参数很多,表1为 sort 命令的参数及说明: 表1: sort 命令的参数及

Shell命令-文件及内容处理之grep(egrep)、join

文件及内容处理 - grep(egrep).join 1. grep(egrep):文本过滤工具 grep(egrep)命令的功能说明 grep命令是Linux系统中最重要的命令之一,其功能是从文本文件或管道数据流中筛选匹配的行及数据,如果配合正则表达式技术一起使用,则功能更加强大.egrep 是 grep 的扩展正则,后面讲三剑客时会讲的. grep命令的语法格式 grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]grep [-abcEFGhHilL

Shell命令-文件及内容处理之split、paste

文件及内容处理 - split.paste 1. split:分割文件为不同的小片段 split命令的功能说明 split 命令用于将一个文件分割成数个.该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件. split命令的语法格式 split [OPTION]... [INPUT [PREFIX]]split [--help][--version][-<行数>][-b <字节>][-C <字节>][-l <行数>][要切割的文件