在Linux下打印两个文件之间的差异

时间:2014-10-09 11:44:06

标签: linux diff

我从我的系统生成快照文件,其中包含目录的用户权限(简短示例如下):
first_snapshot

RO_sad;user_a  
RW_sad;user_b  
RO_5ka;user_c  
RO_wts;user_c  

片刻之后,我得到另一张快照,内容如下:
second_snapshot

RW_sad;user_a  
RW_sad;user_b  
RO_5ka;user_c  

请注意,用户 a (从RO到RW)和用户 c (权限RO_wts已删除)的权限已更改。如何打印这两个文件之间的差异?使用时

diff first_snapshot second_snapshot

我得到这样的东西:

1,4c1,3
< RO_sad;user_a
< RW_sad;user_b
< RO_5ka;user_c
< RO_wts;user_c
\ No newline at end of file
---
> RW_sad;user_a
> RW_sad;user_b
> RO_5ka;user_c
\ No newline at end of file

可以帮助我的所需文件应该是:

remove RO_sad;user_a
add RW_sad;user_a
remove RO_wts;user_c

任何想法我怎么能实现这一目标?我更喜欢使用diff但是我需要删除对我来说无关紧要的条目,比如RW_sad; user_b(存在于两个快照中)或者来自diff的所有插件。

3 个答案:

答案 0 :(得分:1)

你想要一个像这样的“统一差异”:

diff -U0 f1.txt f2.txt

它会给你这样的东西:

--- f1.txt  2014-10-09 19:47:33.000000000 +0800
+++ f2.txt  2014-10-09 19:47:44.000000000 +0800
@@ -1 +1 @@
-RO_sad;user_a
+RW_sad;user_a
@@ -4 +3,0 @@
-RO_wts;user_c

然后您可以用sed:

替换第一个字符
diff -U0 f1.txt f2.txt | sed -n -e 's/^+R/add /p' -e 's/^-R/remove /p'

这会给你:

remove O_sad;user_a
add W_sad;user_a
remove O_wts;user_c

答案 1 :(得分:1)

尝试diff -u

- RO_sad;user_a
+ RW_sad;user_a
- RO_wts;user_c

答案 2 :(得分:0)

@约翰
不完全的。当使用diff -U0时,我得到:

--- first_snapshot  2014-10-09 14:02:27.000000000 +0200
+++ second_snapshot 2014-10-09 14:02:27.000000000 +0200
@@ -1,4 +1,3 @@
-RO_sad;user_a
-RW_sad;user_b
-RO_5ka;user_c
-RO_wts;user_c
\ No newline at end of file
+RW_sad;user_a 
+RW_sad;user_b 
+RO_5ka;user_c
\ No newline at end of file

所以我仍然得到这一行

+RW_sad;user_b

加上条目

\ No newline at end of file

我设法使用AWK

删除了两个文件中的重复值
awk 'FNR==NR{a[$1];next};!($1 in a)' $first $second > $third
awk 'FNR==NR{a[$1];next};!($1 in a)' $second $first > $fourth

然后使用diff

diff -uU0 $fourth $third > diff.txt

我得到了一些我可以使用的东西:

--- fourth  2014-10-09 14:21:07.000000000 +0200
+++ third   2014-10-09 14:21:07.000000000 +0200
@@ -1,2 +1 @@
-RO_sad;user_a
-RO_wts;user_b
+RW_sad;user_a

在diff.txt上使用sed给了我所需要的一切:)