두 개의 구성 파일을 어떻게 비교할 수 있습니까?


15

snmpd.conf 파일이 두 개 있는데, 하나는 작동하는 서버와 다른 하나는 작동하지 않는 파일입니다. 관련없는 주석과 줄 바꿈을 제거하면서 두 개의 구성 파일을 어떻게 구별 할 수 있습니까?


1
Jldugger를 조심하십시오! 당신은하려고합니다 level! =)
Xerxes

주석을 제거하는 것은 정말 나쁜 생각입니다. 주석을 보지 않고 무의미하다는 것을 어떻게 알 수 있습니까?
AnonymousLurker

답변:


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

공백 행과 공백 만 포함하는 행과 추가 된 선행 공백의 단일 차이를 갖는 동일한 행을 피하려면 ...

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

그러나이 시점에서 아마 스크립트에 넣고 조금 더 읽기 쉬운 원래 제안과 같은 것을 쓸 것입니다.


단일 회선 솔루션 제공을위한 +1
wzzrd

공백을 포함하는 줄을 생략하는 방법에 대한 아이디어가 있습니까? 주석을 잘라 내면 빈 줄이 많이 있습니다.
jldugger

@jldugger, grep을 업데이트하여 주석과 공백을 제외하십시오. -egrep -v '^ (#. * |) $'
Zoredache 2016 년

19

vim에 다소 익숙하다면 vimdiff 를 사용하는 것이 좋습니다 .

vimdiff file1 file2

그러면 양쪽에 하나의 파일이있는 두 개의 창이있는 vim 세션이 열립니다. 강조 표시 및 색상은 파일 간의 차이를 나타내며 모든 동일한 부분이 숨겨 지지만 (접히지 만 확장 가능)

그런 다음 한 파일에서 다른 파일로 차이점을 선택적으로 병합하려면 다음 명령을 사용할 수 있습니다.

( "현재 파일"을 커서가있는 것으로 간주하십시오)

한 파일의 창에서 다른 파일의 창으로 포커스를 변경하는 ^ W ^ W

] c 차이로 다음 블록으로 이동

[c 차이가있는 이전 블록에 대한 검색을 반대로하려면

( D IFF btain) 현재 파일에 다른 파일에서 변화를 가져올에

DP ( D IFF P의 UT)이 다른 파일에 현재 파일의 변경을 보내

참고 : 블록에 있거나 블록 아래에 한 줄이면 dodp 모두 작동합니다.

U 은도

텍스트를 펼치거나 숨기기를 해제하는 zo

텍스트를 다시 접거나 다시 숨기려면 zc

zr 은 두 파일을 완전히 펼칩니다 ( 접힘에 대한 자세한 내용은 : help fold 사용 )

: diffupdate 는 파일 변경 사항을 다시 검색합니다.

변경된 텍스트를 옮기거나 변경을 시작하면 파일의 동일 부분도 자동으로 접 힙니다.

완료되면 : xa!를 사용 하여 두 파일을 모두 종료하고 쓸 수 있습니다 .

vim을 사용하는 것처럼 한 번에 한 창씩 변경, 쓰기, 종료 등을 할 수도 있습니다.

모든 일반적인 vim 명령을 사용하여 원하는대로 파일을 편집 할 수 있습니다. vimdiff 세션에서 사용할 수있는 가장 일반적이고 유용한 명령에 대해서만 설명했습니다 (일반 vim과는 반대).


6

Beyond Compare는이를위한 최고의 도구입니다!

링크 : http://www.scootersoftware.com/

Windows 및 Linux에서 사용 가능합니다.

Jeff는이 도구에 대한 좋은 개요 기사를 작성했습니다.
http://www.codinghorror.com/blog/archives/000454.html


비욘드 비교는 대단합니다!
클린턴 블랙 모어

* nix 시스템에서 사용할 수 있습니까?
Preet Sangha

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
Mark Norgren

이 도구 없이는 더 이상 살 수 없었습니다! 극단적 인 시간 절약. 약 1 년 전에 PC에서 Mac으로 변경했을 때 나는 그것이 단지 Mac으로 포팅되었다는 것을 알게되어 매우 기뻤습니다.
Jpsy 2015 년

5

nima의 one-liner에서 확장하면 쉘 함수로 수행하여 .bashrc에 넣을 수 있습니다

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

(통합 diff를 좋아하기 때문에 -u 사용)

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

GUI diff 뷰어를 좋아한다면 meld는 훌륭하며 개정 제어 dirs / 파일을 이해합니다.


meld의 경우 +1로 그래픽 diff'ing sooo가 훨씬 쉬워졌습니다.
Avery Payne

4

주석을 청소 한 후 KDiff3을 사용하는 것이 좋습니다. 꽤 좋은 diff / 병합 도구이며 사용하기 위해 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

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

apt-get install wdiff이 스크립트를 사용하기 직전에 Ubuntu 및 기타 데비안 기반 시스템에서 .

용융

Meld는 훌륭한 GUI 대안이지만 "텍스트 필터링"기능에는 몇 가지 문제가 있습니다. 텍스트 필터링을 사용하는 대신 Meld에 결과를 표시하기 전에 주석을 모두 제거했습니다. 단점은 파일을 비교하는 동안 파일을 편집하는 기능을 잃어 버리는 것입니다. 다음은 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 대신 사용하십시오)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.