diff --changed-group-format='-%<+%>' --unchanged-group-format='' f g
例子:
printf 'a\nb\nc\nd\ne\nf\ng\n' > f
printf 'a\nB\nC\nd\nE\nF\ng\n' > g
diff --old-line-format=$'-%l\n' \
--new-line-format=$'+%l\n' \
--unchanged-line-format='' \
f g
输出:
-b
-c
+B
+C
-e
-f
+E
+F
因此,它显示旧行,-紧跟其后的是相应的新行+。
如果我们删除了C:
printf 'a\nb\nd\ne\nf\ng\n' > f
printf 'a\nB\nC\nd\nE\nF\ng\n' > g
diff --old-line-format=$'-%l\n' \
--new-line-format=$'+%l\n' \
--unchanged-line-format='' \
f g
它看起来像这样:
-b
+B
+C
-e
-f
+E
+F
格式记录在man diff:
--line-format=LFMT
format all input lines with LFMT`
和:
LTYPE is 'old', 'new', or 'unchanged'.
GTYPE is LTYPE or 'changed'.
和:
LFMT (only) may contain:
%L contents of line
%l contents of line, excluding any trailing newline
[...]
试试通讯
另一种看待它的方式:
显示仅存在于文件 a 中的行:(即从 a 中删除的内容)
显示仅存在于文件 b 中的行:(即添加到 b 中的内容)
显示仅存在于一个文件或另一个文件中的行:(但不能同时存在)
(警告:如果文件
a
有以 TAB 开头的行,它(第一个 TAB)将从输出中删除。)仅排序文件
注意:这两个文件都需要进行排序
comm
才能正常工作。如果它们尚未排序,您应该对它们进行排序:如果文件非常长,这可能是一个相当大的负担,因为它需要额外的副本,因此需要两倍的磁盘空间。
显示没有上下文的添加和删除,行号,+,-,<,>!等等,你可以像这样使用差异:
例如,给定两个文件:
一个.txt
b.txt
以下命令将显示从 a 中删除或添加到 b 的行:
输出:
这个稍有不同的命令将显示从 a.txt 中删除的行:
输出:
最后,此命令将显示添加到 a.txt 的行
输出
comm
可能会做你想做的事。从它的手册页:这些列可以分别用
-1
和-2
来抑制-3
。例子:
如果您只想要独特的行而不关心它们在哪个文件中:
正如手册页所说,必须事先对文件进行排序。
视觉比较工具将两个文件组合在一起,因此具有相同行数但内容不同的段将被视为已更改的段。匹配段之间的全新行被视为添加的段。
这也是sdiff命令行工具的工作方式,它显示了终端中两个文件的并排比较。更改的行由 | 分隔 特点。如果一行仅存在于文件 A 中,则使用 < 作为分隔符。如果一行只存在于文件 B 中,则 > 用作分隔符。如果文件中没有 < 和 > 字符,则可以使用它来仅显示添加的行:
不,
diff
实际上并没有以人们可能认为的方式显示两个文件之间的差异。patch
它为喜欢用来将一个文件更改为另一个文件的工具生成一系列编辑命令。任何尝试做您正在寻找的事情的困难在于如何定义什么构成了已更改的行与删除的行和添加的行。还有当添加、删除和更改相邻的行时该怎么办。
这就是 diff 默认所做的......也许你需要添加一些标志来忽略空格?
应该忽略空行和不同数量的空格。
谢谢 senarvi,您的解决方案(未投票)实际上给了我在大量页面上寻找年龄后我想要的东西。
使用您的答案,这是我想出的获取更改/添加/删除的内容列表的方法。该示例使用 2 个版本的 /etc/passwd 文件并打印出相关记录的用户名。
我发现这种特殊形式通常很有用:
例子:
输出:
因此,它显示旧行,
-
紧跟其后的是相应的新行+
。如果我们删除了
C
:它看起来像这样:
格式记录在
man diff
:和:
和:
相关问题:https ://stackoverflow.com/questions/15384818/how-to-get-the-difference-only-additions-between-two-files-in-linux
在 Ubuntu 18.04 中测试。
我们可以结合 diff 和 sed 来实现你想要的。让我们以 https://serverfault.com/a/68717/947477中的相同示例为例
要显示添加的行
+
和删除的行,-
我们可以使用在这里,
-u
用于打印统一的内容,并且sed
将仅过滤带有-
或+
开头的输出。一个更直接的答案是
文件1:
文件2:
利用:
这显示了relectives 文件的两列。
输出: