Linux中的Diff命令用于逐行比较两个文件的内容,如果找到差异,则还会列出差异以及行号。Diff命令还可用于比较两个目录的内容。本文介绍了9个diff命令的使用示例。
diff命令的语法:
#diff file1 file2
diff命令的输出可以采用以下格式:
Normal (default)
Context
Unified
diff命令输出中使用的参数为:
-a 它表示已添加了一些内容
-c 表示某些文本已更改
-d 表示某些文本已被删除
默认情况下,diff命令输出为正常格式,这意味着当两个文件的内容相同时,将不会产生任何输出,但会得到提示。
在本文中,我们将通过不同的实际示例来学习Linux diff命令。
示例:1)用diff命令比较两个文件
假设我们有两个文件aachen.txt和sydney.txt,以下是这些文件的内容,
[root@linuxtechi ~]# cat aachen.txt
Linux Rocks in the open source world, followings are the linux distributions:
CentOS
Red Hat
Ubuntu Debian
Linux Mint
OpenSUSE
Fedora
[root@linuxtechi ~]# cat sydney.txt
Linux Rocks in the open source world, followings are the linux distributions:
CentOS
Red Hat
Ubuntu Debian
Linux Mint
OpenSUSE
Fedora
[root@linuxtechi ~]#
让我们使用diff命令比较这些文件的内容。
[root@linuxtechi〜]#diff aachen.txt sydney.txt
[root@linuxtechi〜]#
上面的输出确认两个文件相同。让我们在aachen.txt中进行一些更改,将开放源代码重写为“open-source”。
现在,重新运行diff命令。
[root@linuxtechi ~]# diff aachen.txt sydney.txt
输出:
在输出中,1c1表示需要更改第一个文件的第一行以使两个文件相同。
让我们回滚以上更改,并在文件末尾的sydeny.txt中添加新行“Arch Linux”,然后再次运行diff命令,
diff命令“7a8”的输出表明,在第一个文件的第七行之后,我们需要添加另一行以匹配第二个文件的第八行。
让我们从sydney.txt中删除“ Arch Linux”和“ Fedora”,然后尝试比较这些文件,
diff命令“ 7d6 ”的输出表明,我们需要删除第一个文件中的第7行以与第二个文件在行号6进行同步。
示例:2)以上下文格式(-c)输出Diff命令
在diff命令中使用“ -c”选项以上下文格式生成diff命令输出。示例如下所示,
[root@linuxtechi ~]# diff -c aachen.txt sydney.txt
前两行表示文件名及其修改日期和时间,三个星号(“***”)表示第一个文件,三个连字符(“-”)表示第二个文件。
仅单个连字符“-”表示需要删除该行,加号“ +”表示需要在文件中添加该行。如果不需要任何更改的行,则以两个空格作为前缀。
示例:3)以统一格式(-u)输出Diff命令
如果要以统一格式生成其输出,请在diff命令中使用“ -u”选项,示例如下所示,
[root@linuxtechi ~]# diff -u aachen.txt sydney.txt
上面的输出有点类似于上下文格式,但是统一格式以简洁的方式显示了输出,这里的前两行表示文件名及其修改日期和时间。
三个连字符(“-”)表示第一个文件,三个加号(“ +++”)表示第二个文件,两个@符号“ -1,7”表示从第一个文件开始的行,“ + 1,7”表示行数从第二个文件开始。另外,符号(+ Core OS)表示需要在第一个文件中添加此行,符号连字符(-Fedora)表示需要从第一个文件中删除此行以使其与第二个文件相同。
示例:4)在比较文件时忽略大小写(-i)
默认情况下,diff命令区分大小写,如果要在diff命令中忽略大小写,则使用“ -i”选项,示例如下所示,
假设我们有两个文件的以下内容
不带任何选项运行diff命令,
[root@linuxtechi ~]# diff aachen.txt sydney.txt
5,6c5,6
< Ubuntu debian
< Linux mint
---
> Ubuntu Debian
> Linux Mint
[root@linuxtechi ~]#
现在,使用-i选项运行diff命令,
[root@linuxtechi ~]# diff -i aachen.txt sydney.txt
[root@linuxtechi ~]#
从上面的输出中可以看到,当使用-i选项时,diff命令忽略了区分大小写的功能。
示例:5)报告文件与diff命令(-s)相同
在某些情况下,我们使用diff命令比较文件,如果内容相同,则我们希望显示消息文件相同,这可以通过在diff命令中传递“ -s”选项来实现,
[root@linuxtechi ~]# cat filex.txt
DevOPs Engineer
Cloud Stack Engineer
Linux System Admin
Monitoring Team
[root@linuxtechi ~]# cat filey.txt
DevOPs Engineer
Cloud Stack Engineer
Linux System Admin
Monitoring Team
[root@linuxtechi ~]# diff -s filex.txt filey.txt
Files filex.txt and filey.txt are identical
[root@linuxtechi ~]#
示例:6)与diff(-b)比较文件时忽略空白
假设我们有两个文件filea.txt和fileb.txt,其中空格不一致,因此,如果我们不带任何选项使用diff命令,即使内容相同,它也会显示空格差异,因此在这种情况下,我们可以使用-b选项忽略diff命令中不一致的空格,示例如下所示,
[root@linuxtechi ~]# cat filea.txt
Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks.
[root@linuxtechi ~]# cat fileb.txt
Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks.
[root@linuxtechi ~]#
使用diff命令比较没有任何选项的文件,
[root@linuxtechi ~]# diff filea.txt fileb.txt
1c1
< Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks.
---
> Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks.
[root@linuxtechi ~]#
现在在diff命令中使用-b选项
[root@linuxtechi ~]# diff -b filea.txt fileb.txt
[root@linuxtechi ~]#
如果要在使用diff命令进行比较时忽略所有空白,请使用“-w”选项
[root@linuxtechi ~]# diff -w filea.txt fileb.txt
示例:7)在比较期间忽略行末空白(-Z)
如果要在比较过程中忽略行尾的试行空间,请使用“-Z”选项
[root@linuxtechi ~]# diff -Z filea.txt fileb.txt
在比较命令中使用“-B”忽略比较中的所有空白行,
[root@linuxtechi ~]# diff -B filea.txt fileb.txt
示例:8)用diff命令比较两个目录
假设我们有两个名称分别为lab01和lab02的目录,它们具有以下文件和子目录
[root@linuxtechi ~]# ls -l lab01/
total 0
-rw-r--r--. 1 root root 0 Feb 1 17:49 filea.txt
-rw-r--r--. 1 root root 0 Feb 1 17:49 fileb.txt
-rw-r--r--. 1 root root 0 Feb 1 17:49 filec.txt
-rw-r--r--. 1 root root 0 Feb 1 17:49 filed.txt
drwxr-xr-x. 2 root root 23 Feb 1 17:50 sitea
[root@linuxtechi ~]# ls -l lab02/
total 0
-rw-r--r--. 1 root root 0 Feb 1 17:49 filea.txt
-rw-r--r--. 1 root root 0 Feb 1 17:49 fileb.txt
-rw-r--r--. 1 root root 0 Feb 1 17:49 filec.txt
-rw-r--r--. 1 root root 0 Feb 1 17:49 filed.txt
drwxr-xr-x. 2 root root 23 Feb 1 17:50 sitea
[root@linuxtechi ~]#
让我们使用下面的diff命令比较这两个目录,
[root@linuxtechi ~]# diff -qr lab01/ lab02/
[root@linuxtechi ~]#
-q-它指示diff命令仅在文件不同时才报告
-r它指示diff命令以递归方式查找子目录中的差异
当我们得到空白输出时,这意味着两个目录是相同的。让我们从lab02删除filed.txt,然后尝试进行比较。
[root@linuxtechi ~]# cd lab02/
[root@linuxtechi lab02]# rm -f filed.txt
[root@linuxtechi lab02]# cd
[root@linuxtechi ~]# diff -qr lab01/ lab02/
Only in lab01/: filed.txt
[root@linuxtechi ~]#
上面的输出显示filed.txt仅存在于lab01目录中
示例:9)将diff命令输出重定向到文件
可以使用符号“>”将Diff命令输出重定向到文件。它仅在diff命令的输出包含差异时才需要执行任务的Shell脚本中非常有用。
[root@linuxtechi ~]# diff aachen.txt sydney.txt
9,10d8
< SLES
< Puppy Linux
[root@linuxtechi ~]# diff aachen.txt sydney.txt > diff.txt
[root@linuxtechi ~]# cat diff.txt
9,10d8
< SLES
< Puppy Linux
[root@linuxtechi ~]#
以上全部来自本文,希望现在通过上述示例,您对diff命令有更好的了解。