繁体   English   中英

如何在 Linux 中进行单向差异?

[英]How do I do a one way diff in Linux?

如何在 Linux 中进行单向差异?

diff 的正常行为:

通常, diff 会告诉您两个文件之间的所有差异。 例如,它会告诉您文件 A 中不在文件 B 中的任何内容,还会告诉您在文件 B 中但不在文件 A 中的所有内容。例如:

文件 A 包含:

cat
good dog
one
two

文件 B 包含:

cat
some garbage
one
a whole bunch of garbage
something I don't want to know

如果我按如下方式进行常规差异:

差异AB

输出将类似于:

2c2
< good dog
---
> some garbage
4c4,5
< two
---
> a whole bunch of garbage
> something I don't want to know

我在找什么:

我想要的只是第一部分,例如,我想知道文件 A 中的所有内容,而不是文件 B。但是,我希望它忽略文件 B 中的所有内容,而不是文件 A 中的所有内容。

我想要的是命令或一系列命令:

??? AB

产生输出:

2c2
< good dog
4c4,5
< two

我相信可以通过将 diff 的输出通过管道传输到 sed 或 awk 来实现解决方案,但我对这些工具不够熟悉,无法提出解决方案。 我基本上想删除所有以 --- 和 > 开头的行。

编辑:我编辑了示例以说明一行中的多个单词。

注意:这是一个“子问题”: 确定安装在 RedHat Linux 机器上的非操作系统包列表

注意:这与此处提出的问题相似,但不相同(例如不是欺骗): 单向差异文件

diff AB|grep '^<'|awk '{print $2}'

grep '^<'表示选择行以 < 开头

awk '{print $2}'表示选择第二列

另一种选择,如果您的文件仅由单行实体组成,并且输出顺序无关紧要(措辞上的问题不清楚),则为:

comm -23 <(sort A) <(sort B)

comm要求对其输入进行排序, -2表示“不向我显示第二个文件独有的行”,而-3表示“不向我显示两个文件之间共有的行” .

但是,如果您需要按照出现的顺序显示“差异”,则上述diff / awk解决方案是可以的(尽管grep位并不是真正必要的 - 它可能是diff AB | awk '/^</ { $1 = ""; print }'

编辑:修复了要报告的哪一组行 - 我最初是向后阅读的......

正如评论中所述,一个最正确的答案是

diff A B | grep '^<'

虽然这会给输出

< good dog
< two

而不是

2c2
< good dog
4c4,5
< two

如果您还想查看有问题的文件,如果文件夹不同,您可以使用

diff public_html temp_public_html/ | grep '^[^>]'

匹配除以 > 开头的所有行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM