如何区分两个配置文件?


15

我有两个snmpd.conf文件,一个在工作正常的服务器上,另一个在不工作的服务器上。如何在去除不相关的注释和换行符的同时区分两个配置文件?


1
当心jldugger!你要level!=)
Xerxes,

删除注释确实是一个坏主意,您怎么知道不看注释就不相关呢?
AnonymousLurker

Answers:


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

为了避免出现空行以及除了空格之外只包含空格的行,除了添加了前导空格的唯一区别的相同行之外...

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

但是,到那时,我可能已经将其放入脚本中并编写了一些类似原始建议的内容,但更具可读性。


+1用于提供单行解决方案
wzzrd,2009年

关于如何省略包含空格的行的任何想法吗?事实证明,一旦您删除注释,就会有很多空白行将它们隔开。
jldugger,2009年

@jldugger,尝试将grep更新为这样,以排除注释和空格。-egrep -v'^(#。* |)$'
Zoredache

19

如果您对vim感到满意,我强烈建议您使用vimdiff

vimdiff file1 file2

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

然后,如果要有选择地合并一个文件与另一个文件之间的差异,可以使用以下命令:

(将“当前文件”视为光标所在的文件)

^ W ^ W 将焦点从一个文件的窗口切换到另一个文件的窗口

] c 前进到具有差异的下一个块

[c 反向搜索具有差异的前一个块

d IFF Ø btain)把从其他文件更改到当前文件

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

注意:如果您在一个块上或仅在块下一行,则dodp可以工作。

üü NDO

zo 展开/取消隐藏文本

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

zr会完全展开两个文件(使用:help fold可了解有关折叠的更多信息)

:diffupdate将重新扫描文件以进行更改

当您开始移动更改的文本或引入更改时,文件中现在相同的部分也会自动折叠。

完成后,可以使用:xa退出并写入两个文件

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

您可以使用所有常见的vim命令随意编辑文件;我仅描述了您可能在vimdiff会话中使用的最常见和最有用的命令(与通用vim相对)。


6

超越比较是做到这一点的终极工具!

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

适用于Windows和Linux。

Jeff不久前写了一篇很好的有关该工具的概述文章:http :
//www.codinghorror.com/blog/archives/000454.html


超越比较太棒了!
克林顿·布莱克莫尔

在* nix系统上可用吗?
Preet Sangha,2009年

Beyond Compare 3不能在Linux上作为控制台应用程序运行。它需要X-Windows。支持的Linux发行版(32位)Red Hat Enterprise Linux 4,5 Fedora 4-10 Novell Suse Linux Enterprise Desktop 10 openSUSE 10.3,11 Ubuntu 6.06-8.10未经测试的任何64位Linux内核不兼容Red Hat Enterprise Linux 3
标记Norgren

没有这个工具,我活不下去了!极节省时间。大约1年前,当我从PC更改为Mac时,我很高兴发现它也刚刚移植到Mac。
Jpsy

5

扩展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很好,并且了解受版本控制的目录/文件。


+1可以使图形化差异变得更加容易。
艾利·佩恩

4

清除注释后,我建议使用KDiff3,它是一个非常好的差异/合并工具,您不需要vim fu即可使用它:)


3

可能有一种更优雅的方法,但实用(快速)地:

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

2

如果您使用的是类似bash的外壳,则可以尝试以下操作:

# 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 ...

您也可以更改diffvimdiffgvimdiff两者都附带vim


2

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

威迪夫

wdiff有时可能“太聪明”,但我发现它通常有助于快速浏览配置文件之间的差异。此脚本可用于带有颜色的输出:

#!/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替代方案,但是其“文本过滤”功能存在一些问题。我不使用文本过滤,而是在将结果显示为“混合”之前完全删除了注释。缺点是在比较文件时失去了编辑文件的能力。这是一个使用Meld的简单脚本:

#!/bin/bash

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

2

有时,可以通过在diff之前对文件进行排序来去除一些其他常见行,因此,我将在已经编写的内容中添加以下内容:

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

对于行顺序不影响其内容的文件,这当然是有意义的(请注意)。


1

这与nima的一支衬纸相同,但也会根据某些人的要求过滤出空白行。

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

(如果可能,我也会安装colordiff并使用它代替普通的diff)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.