我怎样才能比较两个configuration文件?

我有两个snmpd.conf文件,一个在工作的服务器上,另一个没有。 如何区分两个configuration文件,同时剥离不相关的注释和换行符?

     diff <(grep -v '^#' f1) <(grep -v '^#' f2) 

    为了避免空白行和除了空格之外不含任何内容的行,除了具有添加的前导空格的单个差别的相同行之外…

     diff -b \ <(grep -vE '^([ \t]*#|^[ \t]*$)' f1)\ <(grep -vE '^([ \t]*#|^[ \t]*$)' f2) 

    不过,现在我可能会把它写成一个脚本,写一些类似于原来的可读性更高的build议。

    如果你对vim感觉舒服,我会强烈build议你使用vimdiff

     vimdiff file1 file2 

    这将打开一个vim会议与两个窗格,每边一个文件。 亮点和颜色将显示文件之间的差异,所有相同的部分将被隐藏(折叠,但可扩展)。

    然后,如果要select性地将一个文件的差异合并到另一个文件,可以使用以下命令:

    (考虑“当前文件”是光标所在的位置)

    ^ W ^ W将焦点从一个文件的窗口改变到另一个文件的窗口

    以不同的方式前进到下一个街区

    [c反向search前一个区块

    (如果有),将其他文件的更改导入当前文件

    dpd iff p ut)将当前文件的更改发送到另一个文件

    注意:如果您位于一个块或一个块下的一行, dodp可以工作。

    ü

    zo展开/取消隐藏文字

    zc重新折叠/重新隐藏文字

    zr将完全展开这两个文件(使用:帮助折叠更多关于折叠)

    :diffupdate将重新扫描文件的更改

    当您开始移动已更改的文本或进行更改时,文件的相同部分也会自动折叠。

    当你完成后,你可以退出并写入这两个文件:xa!

    您也可以一次写入,退出,放弃更改等操作,就像您通常使用vim一样。

    你可以使用所有常用的vim命令来编辑文件, 我只描述了可能在vimdiff会话中使用的最常用和最有用的命令(与通用的vim相比)。

    超越比较是最终的工具!

    链接: http : //www.scootersoftware.com/

    适用于Windows和Linux。

    杰夫写了一篇很好的关于这个工具的概述文章:
    http://www.codinghorror.com/blog/archives/000454.html

    在nima的单行版本上进行扩展,可以将其作为shell函数,并将其放在.bashrc中

     diff <(grep -v '^#' f1) <(grep -v '^#' f2) 

    成为(使用-u,因为我喜欢统一的差异)

     function cleandiff { diff -u <(grep -v '^#' $1| grep -v '^ *$') <(grep -v '^#' $2 | grep -v '^ *$') } 

    如果你喜欢GUI差异查看器,meld是不错的,并理解修订控制目录/文件。

    清理注释后,我会build议使用KDiff3,这是一个很不错的差异/合并工具,你不需要vim fu来使用它:)

    可能有一个更优雅的方式来做到这一点,但务实(快速):

     grep -v '^#' server1-snmpd.conf | grep -v '^ *$' > server1-snmpd.conf-clean grep -v '^#' server2-snmpd.conf | grep -v '^ *$' > server2-snmpd.conf-clean diff server1-snmpd.conf-clean server2-snmpd.conf-clean 

    如果你使用类似bash的shell,你可以试试这个:

     # Name this diff-stripped STRIPPED= for i in $*; do egrep -v "^#|^\s*" "$i" > "$i.stripped" STRIPPED="$STRIPPED $i.stripped" done diff $STRIPPED 

    然后像这样调用它:

      diff-stripped file1 file2 ... 

    你也可以把diff gvimdiff vimdiffgvimdiff ,这些都是vim自带的。

    扩展Xerxes的解决scheme,您可以使用比diff更复杂的工具来显示差异。

    wdiff

    有时候, wdiff可能会“太聪明”,但是我发现通过快速浏览一下configuration文件之间的差别通常是很有用的。 这个脚本可以用于颜色输出:

     #!/bin/bash RED=$'\e'"[1;31m" GREEN=$'\e'"[1;32m" RESET=$'\e'"[0m" WDIFF_ARGS="-w$RED -x$RESET -y$GREEN -z$RESET --avoid-wraps" wdiff $WDIFF_ARGS \ <(grep -vE '^([ \t]*#|^[ \t]*$)' $1) \ <(grep -vE '^([ \t]*#|^[ \t]*$)' $2) \ | less -R 

    在Ubuntu和其他基于Debian的系统上,只需apt-get install wdiff使用该脚本。

    合并

    Meld是一个不错的GUI替代品,但其“文本过滤”function有一些问题。 在显示Meld中的结果之前,我不使用文本过滤,而是完全删除注释。 缺点是在比较文件时失去了编辑文件的能力。 下面是使用Meld的简单脚本:

     #!/bin/bash meld <(grep -vE '^([ \t]*#|^[ \t]*$)' $1) \ <(grep -vE '^([ \t]*#|^[ \t]*$)' $2) 

    有时,在diff之前,可以通过sorting文件来剥离几个额外的常见行,所以我会添加已经写入以下内容的行:

      diff <(grep -v '^#' f1 | sort) <(grep -v '^#' f2 | sort) 

    这对于文件的顺序不会影响内容的文件当然是有意义的(所以要注意)。

    这和尼玛的class轮是一样的,但是也会像有人要求的那样过滤掉空行。

     diff -u <(egrep -v '^(#| *$)' f1) <(egrep -v '^(#| *$)' f2) 

    (如果可能的话,我也会安装colordiff,并使用它来代替正常的diff)