jldugger Asked: 2009-05-29 18:12:43 +0800 CST2009-05-29 18:12:43 +0800 CST 2009-05-29 18:12:43 +0800 CST 如何区分两个配置文件? 772 我有两个 snmpd.conf 文件,一个在可以工作的服务器上,一个不工作。如何区分两个配置文件,同时去除不相关的注释和换行符? linux configuration diff 11 个回答 Voted rgmarcha 2009-05-29T18:56:44+08:002009-05-29T18:56:44+08:00 如果您对vim有点熟悉,我强烈建议您使用vimdiff: vimdiff file1 file2 这将打开一个带有两个窗格的 vim 会话,每一侧都有一个文件。突出显示和颜色将指示文件之间的差异,并且所有相同的部分将被隐藏(折叠,但可展开)。 然后,如果要选择性地将一个文件的差异合并到另一个文件,可以使用以下命令: (考虑“当前文件”是光标所在的那个) ^W^W 将焦点从一个文件的窗口转移到另一个文件的窗口 ]c 前进到有差异的下一个区块 [c 反向搜索前一个有差异的块 do ( diff o btain ) 将更改从另一个文件带到当前文件 dp ( d iff p ut) 将更改从当前文件发送到另一个文件 注意:如果您在一个块上或仅在一个块下的一行上,do和dp都可以工作。 你 对你撤消 zo 展开/取消隐藏文本 zc重新折叠/重新隐藏文本 zr将完全展开两个文件(使用:help fold了解有关折叠的更多信息) :diffupdate将重新扫描文件以进行更改 当您开始移动更改的文本或引入更改时,文件中现在相同的部分也会自动折叠。 完成后,您可以退出并使用:xa 写入这两个文件! 您还可以一次写入、退出、放弃更改等,就像您通常使用 vim 所做的那样。 可以使用所有常用的vim命令随意编辑文件;我只描述了您可能在 vimdiff 会话中使用的最常见和最有用的命令(与通用 vim 会话相反)。 Best Answer Xerxes 2009-05-29T18:29:47+08:002009-05-29T18:29:47+08:00 diff <(grep -v '^#' f1) <(grep -v '^#' f2) 为了避免空行和只包含空格的行,除了具有添加前导空格的单一差异的相同行... diff -b \ <(grep -vE '^([ \t]*#|^[ \t]*$)' f1)\ <(grep -vE '^([ \t]*#|^[ \t]*$)' f2) 不过,到现在为止,我可能会将其放入脚本中并编写类似于原始建议的内容,该建议更具可读性。 Mark Norgren 2009-05-29T19:01:45+08:002009-05-29T19:01:45+08:00 Beyond Compare 是实现此目的的终极工具! 链接: http ://www.scootersoftware.com/ 适用于 Windows 和 Linux。 Jeff 不久前写了一篇关于该工具的很好的概述文章:http: //www.codinghorror.com/blog/archives/000454.html Rob Chanter 2009-05-29T23:17:38+08:002009-05-29T23:17:38+08:00 扩展 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 diff 查看器,meld 很好,并且理解版本控制的目录/文件。 Kosta 2009-05-30T01:40:35+08:002009-05-30T01:40:35+08:00 清理完评论后,我建议使用 KDiff3,它是一个非常好的 diff/merge 工具,你不需要 vim fu 来使用它:) jj33 2009-05-29T18:22:43+08:002009-05-29T18:22:43+08:00 可能有一种更优雅的方式来做到这一点,但务实(而且快速): 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 Neil 2009-05-29T19:26:17+08:002009-05-29T19:26:17+08:00 如果您使用的是类似 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为vimdiff或gvimdiff两者都附带vim。 akaihola 2010-12-15T13:11:09+08:002010-12-15T13:11:09+08:00 扩展 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 中显示结果之前完全删除了评论。缺点是在比较文件时失去了编辑文件的能力。这是一个使用 Meld 的简单脚本: #!/bin/bash meld <(grep -vE '^([ \t]*#|^[ \t]*$)' $1) \ <(grep -vE '^([ \t]*#|^[ \t]*$)' $2) Oriettaxx 2012-02-13T10:10:32+08:002012-02-13T10:10:32+08:00 有时,可以通过在 diff 之前对文件进行排序来去除几个额外的公共行,所以我将添加到已经编写的以下内容: diff <(grep -v '^#' f1 | sort) <(grep -v '^#' f2 | sort) 这对于行的顺序不影响其内容的文件当然是有意义的(所以要注意)。 Mark 2009-05-30T12:04:25+08:002009-05-30T12:04:25+08:00 这与 nima 的一个衬里相同,但也会根据某人的要求过滤掉空白行。 diff -u <(egrep -v '^(#| *$)' f1) <(egrep -v '^(#| *$)' f2) (如果可能的话,我也会安装 colordiff 并使用它来代替普通的 diff)
如果您对vim有点熟悉,我强烈建议您使用vimdiff:
这将打开一个带有两个窗格的 vim 会话,每一侧都有一个文件。突出显示和颜色将指示文件之间的差异,并且所有相同的部分将被隐藏(折叠,但可展开)。
然后,如果要选择性地将一个文件的差异合并到另一个文件,可以使用以下命令:
(考虑“当前文件”是光标所在的那个)
^W^W 将焦点从一个文件的窗口转移到另一个文件的窗口
]c 前进到有差异的下一个区块
[c 反向搜索前一个有差异的块
do ( diff o btain ) 将更改从另一个文件带到当前文件
dp ( d iff p ut) 将更改从当前文件发送到另一个文件
注意:如果您在一个块上或仅在一个块下的一行上,do和dp都可以工作。
你 对你撤消
zo 展开/取消隐藏文本
zc重新折叠/重新隐藏文本
zr将完全展开两个文件(使用:help fold了解有关折叠的更多信息)
:diffupdate将重新扫描文件以进行更改
当您开始移动更改的文本或引入更改时,文件中现在相同的部分也会自动折叠。
完成后,您可以退出并使用:xa 写入这两个文件!
您还可以一次写入、退出、放弃更改等,就像您通常使用 vim 所做的那样。
可以使用所有常用的vim命令随意编辑文件;我只描述了您可能在 vimdiff 会话中使用的最常见和最有用的命令(与通用 vim 会话相反)。
为了避免空行和只包含空格的行,除了具有添加前导空格的单一差异的相同行...
不过,到现在为止,我可能会将其放入脚本中并编写类似于原始建议的内容,该建议更具可读性。
Beyond Compare 是实现此目的的终极工具!
链接: http ://www.scootersoftware.com/
适用于 Windows 和 Linux。
Jeff 不久前写了一篇关于该工具的很好的概述文章:http:
//www.codinghorror.com/blog/archives/000454.html
扩展 nima 的单线,您可以将其作为 shell 函数执行并将其放入您的 .bashrc
变成(使用 -u 因为我喜欢统一差异)
如果你喜欢 GUI diff 查看器,meld 很好,并且理解版本控制的目录/文件。
清理完评论后,我建议使用 KDiff3,它是一个非常好的 diff/merge 工具,你不需要 vim fu 来使用它:)
可能有一种更优雅的方式来做到这一点,但务实(而且快速):
如果您使用的是类似 bash 的 shell,您可以试试这个:
然后像这样调用它:
您也可以更改
diff
为vimdiff
或gvimdiff
两者都附带vim
。扩展 Xerxes 的解决方案,您可以使用比
diff
显示差异更复杂的工具。差异
wdiff
有时可能“太聪明”,但我发现它通常有助于快速浏览配置文件之间的差异。此脚本可用于输出颜色:在 Ubuntu 和其他基于 Debian 的系统上,就
apt-get install wdiff
在使用这个脚本之前。融合
Meld 是一个不错的 GUI 替代品,但它的“文本过滤”功能存在一些问题。我没有使用文本过滤,而是在 Meld 中显示结果之前完全删除了评论。缺点是在比较文件时失去了编辑文件的能力。这是一个使用 Meld 的简单脚本:
有时,可以通过在 diff 之前对文件进行排序来去除几个额外的公共行,所以我将添加到已经编写的以下内容:
这对于行的顺序不影响其内容的文件当然是有意义的(所以要注意)。
这与 nima 的一个衬里相同,但也会根据某人的要求过滤掉空白行。
(如果可能的话,我也会安装 colordiff 并使用它来代替普通的 diff)