我怎样才能比较显示只添加和删除行? 如果差异不能这样做,什么工具可以?
另一种看待它的方法是:
显示只存在于文件a中的行(即,从a中删除了什么)
comm -23 ab
显示只存在于文件b中的行:(即,什么被添加到b)
comm -13 ab
显示只存在于一个文件或另一个文件中的行(但不能同时存在)
comm -3 ab | sed 's/^\t//'
(警告:如果文件a
有以TAB开头的行,它将从输出中删除(第一个TAB)。)
注:这两个文件需要sorting为“通信”才能正常工作。 如果他们还没有sorting,你应该sorting他们:
sort <a >a.sorted sort <b >b.sorted comm -12 a.sorted b.sorted
如果文件非常长,这可能是一个相当的负担,因为它需要一个额外的副本,因此磁盘空间的两倍。
comm
可以做你想做的事情。 从其手册页:
描述
逐行比较sorting文件FILE1和FILE2。
没有select,产生三列输出。 第一列包含FILE1唯一的行,第二列包含FILE2唯一的行,第三列包含两个文件共有的行。
这些列可分别用-1
, -2
和-3
进行抑制。
例:
[root@dev ~]# cat a common shared unique [root@dev ~]# cat b common individual shared [root@dev ~]# comm -3 ab individual unique
如果你只是想要独特的线路,不关心他们在哪个文件:
[root@dev ~]# comm -3 ab | sed 's/^\t//' individual unique
如手册页所述,文件必须预先分类。
要显示没有上下文的添加和删除,行号,+, – ,<,>! 等等,你可以像这样使用diff:
diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt
例如,给出两个文件:
A.TXT
Common Common A-ONLY Common
b.txt
Common B-ONLY Common Common
以下命令将显示从a删除或添加到b的行:
diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt
输出:
B-ONLY A-ONLY
这个略有不同的命令将显示从a.txt中删除的行:
diff --changed-group-format='%<' --unchanged-group-format='' a.txt b.txt
输出:
A-ONLY
最后,这个命令将显示添加到a.txt的行
diff --changed-group-format='%>' --unchanged-group-format='' a.txt b.txt
产量
B-ONLY
视觉比较工具将两个文件合并在一起,以便具有相同行数但不同内容的片段将被视为已更改的片段。 匹配段之间的全部新行被认为是附加段。
这也是sdiff命令行工具的工作原理,它显示了terminal中两个文件的并排比较。 更改的行由|分隔 字符。 如果一行仅存在于文件A中,则<用作分隔符。 如果一行仅存在于文件B中,则将>用作分隔符。 如果文件中没有<和>字符,则可以使用它仅显示添加的行:
sdiff AB | grep '[<>]'
这就是差异默认情况下…也许你需要添加一些标志来忽略空白?
diff -b -B
应该忽略空行和不同数量的空格。
不, diff
实际上并没有按照人们可能想到的方式显示两个文件之间的差异。 它为像patch
这样的工具产生一系列编辑命令,用来将一个文件转换成另一个文件。
任何尝试做你正在寻找的东西的困难是如何定义什么构成了一条线已经改变,而不是一个删除的一个,然后再加一个。 当线条被添加,删除和改变时,又该怎么做。
谢谢senarvi,你的解决scheme(没有投票)实际上给了我很多东西,在寻找年龄后,我想吨。
使用你的答案,这是我想出来的东西更改/添加/删除的东西列表。 该示例使用2个版本的/ etc / passwd文件,并输出相关logging的用户名。
#!/bin/bash sdiff passwd1 passwd2 | grep '[|]' | awk -F: '{print "changed: " $1}' sdiff passwd1 passwd2 | grep '[<]' | awk -F: '{print "deleted: " $1}' sdiff passwd1 passwd2 | grep '[>]' | awk -F\> '{print $2}' | awk -F: '{print "added: " $1}'
文件1:
text670_1 text067_1 text067_2
文件2:
text04_1 text04_2 text05_1 text05_2 text067_1 text067_2 text1000_1
使用:
diff -y file1 file2
这显示了两个列的文件。
输出:
text670_1 > text04_1 > text04_2 > text05_1 > text05_2 text067_1 text67_1 text067_2 text67_2 > text1000_1