본문 바로가기

별걸다하는 IT/리눅스 유닉스

[리눅스/유닉스]파일을 비교해주는 diff, diff3 명령어 알아보기, diff 사용법 및 옵션

안녕하세요! 

오늘도 찾아온 양주인장입니다.

헿 이번에 '몰랑이말랑이' 라는 블로그명을 '양햄찌가 만드는 세상'으로 변경하였어요.

개인적으로 몰랑이말랑이 캐릭터를 좋아하지만,, 검색어가 너무 핫해서 키워드가 묻히는 것 같아서 흑흑

 

[리눅스 유닉스 포스팅 모음 링크]

DIFF 명령어 살펴보기!

아무튼 오늘은 오랜만에 매우매우 자주 사용하는 리눅스/유닉스 명령어인 DIFF에 관해서 살펴보려고 합니다.

 

DIFF, 딱 들었을 때 different에서 온 것 같죠?! 넵 차이를 비교한 뒤 알려주는 역할을 합니다.

실제 업무에서는 매우 자주 쓰는 아이예요.

DIFF 언제 사용하는가?

사용 예시를 볼게요. 자, 실제 회사에서 운영중인 소스코드가 있어요. 그런데 어떤 요청이 들어와서 한 부분을 변경하려고 해요. 나는 필요한 부분만 수정하고 나머지 소스들은 건들인 적 없는 것 같은데,,,!! 키보드를 실수로 누르고 눈치를 못챘다던가 이럴 수 있죠? 그리고 반영을 해버리면 큰일날거예요! 예상치 못한 부분에서 에러가 날 수도 있으니까요.

그래서 항상 수정을 하기 전에 원본 파일을 복사해두고, 변경 파일과 원본 파일을 비교해서 정말 내가 원하는 부분만 수정된건지 확인하는 절차가 필요합니다. 이럴 때 사용하는게 diff명령어 입니다.

 

이 외에도,,,초반 A회사와 B회사가 사용하는 응답코드 목록이 동일했는데, 시간이 흐를수록 어떤 부분은 추가 되고 어떤 부분은 변경되어서 통일 작업이 필요할 수도 있겠죠.?

이와 같이 뭔가를 비교할 때에 수시로 사용될 수 있는 명령어가 DIFF입니다!

diff, diff3 문법

diff [옵션] file1 file2 

 

두 개의 파일을 행 단위로 비교하여 차이점을 출력해 주는 명령어입니다. 보통 앞 부분 파일에 원본 파일을 놓고, 뒷 부분에 새로운 파일을 두고 비교합니다.

AIX 에서 살펴보는 man diff 

diff3 [옵션] file1 file2 file3

 

세 개의 파일을 비교하고 싶다면 diff3 명령어를 사용하시면 돼요.

diff, diff3 기본 사용법

[1. 두 파일이 완전 동일한 파일일 때]

test1과 test2 파일에 똑같이 'Hello World!'를 작성 후 diff 명령어로 비교해줬습니다.

두 파일이 완전 동일할 경우 아무것도 출력되지 않아요. diff3도 마찬가지! 세 개의 파일이 동일하다면 아무것도 출력하지 않습니다.

 

[2. 다른 두 파일을 비교할 경우]

왼 AIX 오  ubuntu 결과동일

 test1과 test2의 첫 줄은 동일하도록 그대로 두고,

두 번째 줄에 자신임을 나타내는 'This is test1', 'This is test2'를 추가해줬어요.

'<'이 기호를 삽입되었다라고 생각하면 좀 더 해석하기 편해요.

결과를 보면 '< This is test1' 이렇게 되어있죠? 즉 This is test1은 오른쪽에는 없지만 왼쪽에는 삽입되어 있다. 

이렇게 해석하시면 됩니다.

반대로 '>'이면 왼쪽에는 없지만 오른쪽에는 삽입되었다! 이렇게 판단하시면 기억하기 쉬워요.

Thank you에서 볼 수 있듯이 diff는 공백 개수 또한 다르면 차이를 알려줍니다.

 

'<,>'나타나기 전 줄에 2,3c2,3라는 표식이 있는데

이건 2~3번 라인이 다르다 라는 뜻입니다.

 

[3. 세 파일을 비교할 경우 - 3개가 다를 경우]

AIX

첫번째 줄:

자 'diff3 test1 test2 test3' 명령어를 치고 나서 결과물 가장 첫 줄에 '==='가 보이죠??

이게 의미하는건 이 세 파일이 모두 다 다르다! 라는 뜻입니다.

 

두번째 줄:

그 다음에 1:2c 이런식으로 표현되어 있는게 있는데 ':'콜론 전에 있는 숫자는 파일을 의미합니다 '1:'이면 diff3명령어 다음으로 나왔던 첫 번째 test1파일을 의미하는거죠. '2:'이면 두 번째 파일이 되겠죠?

그 다음은 다른 파일들과 다른 줄(라인)을 의미합니다. 즉 첫 번째 파일의 경우 첫 번째 줄은 다른 파일들과 동일한대 두 번째 줄이 다른 파일들과 다르다는거죠.

 

세번째 줄:

어디 라인이 다른지 알려준 뒤, 첫 번째 파일의 데이터 정보를 보여줍니다.

첫 번째 파일 두번째 라인은 test1인데 이는 다른 파일들과 달라요. 즉 통일시키려면 수정이 필요하단 얘기죠. (물론 같은 파일도 있겠죠? 하나의 파일이라도 다르면 다른거!)

 

네번째 줄:

두 번째 파일인데, 두 번째 파일의 경우 2번째 라인부터 3번째 라인의 데이터가 다르다 

두번째 파일의 두번째 줄은 'test2'이고 3번째 라인은 'thanks'이다. 이렇게 해석될 수 있겠네요. 

 

[4. 세 파일을 비교할 경우 - 2개가 같고 하나가 다를 경우]

test1과 test2 파일의 내용은 동일합니다. 하지만 test3는 달라요.

이렇게 diff3 명령어로 비교해봤을 때롤 살펴봅시다.

 

3번째와 다르게 '==='다음에 3이 붙어서 '===3'이 첫 번째 라인에 출력되었어요.

이 말은 3번째 파일만 다르다!가 됩니다.

 

그 다음 두 라인을 보면 첫 번째 파일과 두 번째 파일의 두 라인이 test1이라는 값을 갖고 있다는 걸 알 수 있어요. 즉 이 부분이 3번째 파일과 다르다는 말이 되겠죠?

옵션 OPTIONS

이제 기본적인 사용법은 알았으니~~~ 좀 더 편하게 사용하기 위한 옵션 정보들을 알아봅시다.

먼저 AIX기준 유닉스 옵션들을 살펴볼게요. 

AIX에서 diff 명령어 옵션들
이건 리눅스 diff 옵션!

상세 내용

어떤 버전에는 있고 없고, 어떤 언어에는 있고 없고 차이점이 있을 수 있으니 꼭 man 명령어로 확인해주기!

옵션  설명
-b 연속된 공백을 무시합니다. (정확히는 엔터를 제외한 연속된 white space 문자들을 하나로 간주!) 
-i 대소문자 구분 없이 비교하고 싶을 때 사용하는 옵션입니다.
-q 두 파일이 다를 경우에만 알려줍니다. (제 기준 리눅스 지원, 유닉스 미지원) 
-r 경로로 지정한 디렉토리 안의 서브 디렉토리를 전부 거슬러 들어가면서 안에 있는 파일을 모두 비교하란 뜻
-s 두 파일이 동일할 경우에만 알려줍니다. 다를 경우 diff 결과 출력 (제 기준 리눅스 지원, 유닉스 미지원) 
-u unifed context 옵션으로 내용, 삭제된거 추가된거, 동일한 것 까지 다 같이 종합적으로 보여줍니다.
-v diff 명령어의 버전을 알려줍니다 (제 기준 리눅스 지원, 유닉스 미지원) 
-w 모든 공백과 탭을 무시! 
-y Side by Side라고 해서, 위아래 비교가 아니라 라인별로 양옆 비교 하고 싶을 때 (제 기준 리눅스 지원, 유닉스 미지원) 

[-b옵션과 -w 옵션 차이]

b옵션:

Causes any amount of white space at the end of a line to be treated as a single newline character.

and other strings of whilte-space characters, not including newline characters, to compare equally.

w옵션:

Ignores all spaces and tab characters and treats all other strings of blanks as equivalent. 

 

-b옵션할 때 주의해야 할 점은 연속된 공백을 무시한다는거지 그냥 공백을 무시한다는게 아님!!

보면 파란색 부분은 test1두 단어 사이에 공백이 여러개 있습니다. 이렇게 연속된 공백의 경우 하나의 공백으로 본다는거죠. 그런데 주확생 같은 경우 test1파일과 test2파일 내용의 차이는 두 단어 사이에 공백이 있느냐 없느냐인데 다른 것으로 인식한 것을 확인할 수 있어요.

 

사실 편하게 공백으로 말하는 거지 정확히는 개행을 제외한 white space문자들을 무시해주는 겁니다. 즉 여러 탭이 와도 하나의 탭으로 간주해요.

 

근데 w옵션도 공백과 탭에 관련된 옵션이죠?

w는 연속된 걸 하나로 간주하는게 아니라 하나가 오던 여러개가 오던 걍 무시합니다.

b옵션결과 w옵션 결과 비교

넵 그렇기 때문에 위의 사진과 같이 결과가 다를 수 있어요.

 

[u옵션]

자주 사용하는 옵션 중 하나이죠. u옵션은 리눅스나 유닉스나 둘 다 가지고 있어서 편해요. 실제 사용해보는게 더 빨리 와닿습니다.

일반 diff명령어 결과를 해석하는 법은 앞에서 살펴보았으니까 이번엔 u옵션 사용한 결과를 볼게요.

u옵션은 unfied context라고 했죠? 말 그래도 하나에다가 다 통일해서 보여주는거예요.

diff 일반 같은 경우에는 동일한건 보여주지 않고, 다른 부분만 정보를 보여준다면

u는 전체를 다 보여주는거죠. 하나로 합쳐서!!

 

첫 번째 결과를 보면 --- test1이 있고 +++ test2가 있어요

---는 원래 파일이고 +++는 바뀐 파일을 의미해요. 즉 --- 파일에서 +++파일이 되려면 아래 작업들을 실행하면 된다는 거죠. 여기서 보이는 마이너스 기호(-)는 삭제되어야 할 것을 말하고 (+)는 추가되어야 할 것을 말합니다.

즉 test1파일이 test2 파일이 되려면 Hello는 그대로 두고 World는 삭제하고(-) 거기에 Friend를 추가(+)하고 door는 내비두고 마지막으로 Window(+)는 추가하면 test2파일과 일치해진다는거!

 

@@ 부분은 어찌보면 요약이예요.

첫 번째 파일은 3라인으로 이루어져있고 두 번째 파일은 4라인으로 이루어져 있다는..

 

사실 작은 파일이면 -u옵션을 사용하면 보기가 편해서 효과적이겠지만 실제 업무에서는 하나의 소스파일이 너~~~무 길어서 diff 기본 명령어를 사용하는 일이 잦긴 합니다. ㅎㅎ 그때그때 상황에 따라서~~

 

[v옵션]

UBUNTU LINUX

리눅스 같은 경우는 'diff -v'이렇게 치시면 위처럼 버전을 보실 수 있거든요, 제 경우는 3.6버전이네요.

AIX UNIX

근데 UNIX의 경우 v옵션을 지원하지 않습니다.

 

[q옵션 s옵션 비교]

다를 경우에만 알려주고 같을 경우에는 아무런 응답 없음!

다를 경우 'Files test1 and test2 differ'이라고 뜨네요. -s옵션을 사용하면 같을 경우 알려주는데, 'Files test1 and test2 are identical'이라고 알려줍니다. 다를 경우 일반 diff 명령어 사용한 것과 같아요.

제 유닉스 서버의 경우 q옵션이던 s옵션이던 illegal option이라고 뜹니다.

 

[y옵션]

양옆으로 라인바이라인 비교하고 싶을 경우 사용하는 옵션입니다.

다른 부분은 '|'기호로 표시되고, FILE1에만 있는 내용은 '<', FILE2 에만 있는 경우는 '>'로 매칭해줬어요.

[r옵션]

Causes application of the diff command recursively to comm subdirectories encountered.

r옵션

테스트를 위해 testdir1 디렉터리 하나, testdir2 디렉터리 둘을 만들어줬어요.

그리고 testdir1에는 sample이라는 파일과 testdir2에는 practice1파일과 sample이라는 파일 총 두 개를 만들어줬습니다.

그리고 testdir1경로와 testdir2경로를 비교했을 때!

 

testdir2에는 어떤 파일이 있는지, 같은 파일이 있다면 내용은 다른지

체크해주는 걸 확인할 수 있어요.

 

오늘은 여기까지입니다! diff, diff3 명령어와 대표적인 옵션들을 알아보았어요.

도움이 되셨다면 공감 또는 댓글 또는 광고보답은 어떠신가요? 정보 공유를 생활화 하는데 큰 힘이 됩니다 :)

그럼 다음 포스팅에서 뵈어요~!