我有两个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前一个区块
(如果有),将其他文件的更改导入当前文件
dp ( d iff p ut)将当前文件的更改发送到另一个文件
注意:如果您位于一个块或一个块下的一行, do和dp都可以工作。
你来ü
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 vimdiff或gvimdiff ,这些都是vim自带的。
扩展Xerxes的解决scheme,您可以使用比diff更复杂的工具来显示差异。
有时候, 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)
我使用WinMerge http://winmerge.org来区分文件,我必须把它们拖到我的机器上,但它适用于。