diff가 추가 및 삭제 된 행만 표시하도록하려면 어떻게해야합니까? diff가 할 수 없다면 어떤 도구를 사용할 수 있습니까? diff가 추가 및 삭제

diff가 추가 및 삭제 된 행만 표시하도록하려면 어떻게해야합니까? diff가 할 수 없다면 어떤 도구를 사용할 수 있습니까?



답변

통신을 시도

그것을 보는 또 다른 방법 :

  • 파일 a에만 존재하는 행을 표시합니다 (예 : a에서 삭제 된 행).

    comm -23 a b
    
  • 파일 b에만 존재하는 줄 표시 : (즉 b에 추가 된 내용)

    comm -13 a b
    
  • 한 파일 또는 다른 파일에만 존재하는 줄 표시 : (둘다는 아님)

    comm -3 a b | sed 's/^\t//'
    

(경고 : 파일 a에 TAB으로 시작하는 줄이 있으면 출력에서 첫 번째 TAB이 제거됩니다.)

정렬 된 파일 만

참고 :comm 제대로 작동하려면 두 파일을 모두 정렬해야합니다 . 정렬되지 않은 경우 정렬해야합니다.

sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted

파일이 너무 길면 추가 사본이 필요하므로 디스크 공간이 두 배나 필요하기 때문에 상당한 부담이 될 수 있습니다.


답변

comm당신이 원하는 것을 할 수 있습니다. 매뉴얼 페이지에서 :

기술

정렬 된 파일 FILE1과 FILE2를 한 줄씩 비교하십시오.

옵션이 없으면 3 열 출력을 생성합니다. 열 1에는 FILE1에 고유 한 행이 있고 열 2에는 FILE2에 고유 한 행이 있고 열 3에는 두 파일에 공통 인 행이 있습니다.

이러한 열은과 suppressable 있습니다 -1, -2그리고 -3각각.

예:

[root@dev ~]# cat a
common
shared
unique

[root@dev ~]# cat b
common
individual
shared

[root@dev ~]# comm -3 a b
    individual
unique

그리고 고유 한 줄을 원하고 어떤 파일에 있는지 신경 쓰지 않으면 :

[root@dev ~]# comm -3 a b | sed 's/^\t//'
individual
unique

매뉴얼 페이지에서 알 수 있듯이 파일을 미리 정렬해야합니다.


답변

문맥, 줄 번호, +,-, <,>없이 추가 및 삭제를 표시하려면! 등, 당신은 다음과 같이 diff를 사용할 수 있습니다 :

diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt

예를 들어, 두 개의 파일이 주어지면 :

a.txt

Common
Common
A-ONLY
Common

b.txt

Common
B-ONLY
Common
Common

다음 명령은 a에서 제거되었거나 b에 추가 된 행을 보여줍니다.

diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt

산출:

B-ONLY
A-ONLY

이 약간 다른 명령은 a.txt에서 제거 된 행을 표시합니다.

diff --changed-group-format='%<' --unchanged-group-format='' a.txt b.txt

산출:

A-ONLY

마지막으로이 명령은 a.txt에 추가 된 줄을 보여줍니다.

diff --changed-group-format='%>' --unchanged-group-format='' a.txt b.txt

산출

B-ONLY

답변

이것이 기본적으로 diff의 기능입니다. 공백을 무시하려면 플래그를 추가해야합니까?

diff -b -B

빈 줄과 다른 수의 공백을 무시해야합니다.


답변

아니요, diff실제로 두 파일의 차이점을 생각하지는 않습니다. patch한 파일을 다른 파일로 변경하는 데 사용 하는 도구에 대한 일련의 편집 명령을 생성합니다 .

찾고있는 것을하기위한 시도의 어려움은 변경된 줄과 추가 된 줄을 변경 한 줄을 구성하는 방법을 정의하는 것입니다. 또한 행이 서로 추가, 삭제 및 변경 될 때 수행 할 작업.


답변

시각적 비교 도구는 두 줄의 파일을 맞추므로 줄 수는 같지만 내용이 다른 세그먼트는 변경된 세그먼트로 간주됩니다. 일치하는 세그먼트 사이의 완전히 새로운 라인은 추가 된 세그먼트로 간주됩니다.

이 방법도 아니면 sdiff 명령 줄 도구 단말기에 두 개의 파일의 병렬 비교를 도시하는 동작. 변경된 줄은 | 캐릭터. 파일 A에만 행이 있으면 <가 구분 문자로 사용됩니다. 파일 B에만 행이 있으면>가 분리 자로 사용됩니다. 파일에 <및> 문자가없는 경우이를 사용하여 추가 된 행만 표시 할 수 있습니다.

sdiff A B | grep '[<>]'

답변

고마워 senarvi, 귀하의 솔루션 (투표하지 않음)은 실제로 많은 페이지에서 연령대를 찾은 후 내가 원하는 것을 정확하게 제공했습니다.

귀하의 답변을 사용하여 다음은 변경 / 추가 / 삭제 된 항목 목록을 얻기 위해 작성한 것입니다. 이 예에서는 2 가지 버전의 / etc / passwd 파일을 사용하고 관련 레코드의 사용자 이름을 인쇄합니다.

#!/bin/bash
sdiff passwd1 passwd2 | grep '[|]' | awk -F: '{print "changed: " $1}'
sdiff passwd1 passwd2 | grep '[<]' | awk -F: '{print "deleted: " $1}'
sdiff passwd1 passwd2 | grep '[>]' | awk -F\> '{print $2}' | awk -F: '{print "added: " $1}'