Download - diff output formats
diff Output Formats
안오균
diff
$ diff foo bar
• 두 파일을 라인 단위로 비교한다.
• diff <원본 파일> <새 파일>
diff Output Formats
• diff의 대표적인 출력 포맷은 다음과 같다.
– Normal Format
– Context Format
– Unified Format
Normal Format
$ diff foo bar
• diff의 기본 출력 옵션으로,
• 두 파일의 변경된 라인만 출력한다.
• 변경된 부분을 명확하게 파악할 수 있지만,
변경된 라인 주변의 데이터 파악이 어렵다.
예제 텍스트
<원본 파일:foo>
1 Hello,
2 I am foo.
3 a
4 b
5 c
6 d
7 e
8
<새 파일:bar>
1 Hello,
2 I am bar.
3 a
4 c
5 d
6 e
7 f
8 g
9
Normal Format: 출력 예제
$ diff foo bar
2c2
< I am foo.
---
> I am bar.
4d3
< b
7a7,8
> f
> g
Normal Format: 출력 형태
• 변경 상태를 나타내는 키워드 이후에,
원본 파일과 새 파일의 라인을 번갈아 출력한다.
변경 키워드
< 원본 파일 라인
< 원본 파일 라인...
---
> 새 파일 라인
> 새 파일 라인...
Normal Format: 변경 키워드
• 변경 키워드는 변경의 상태를 나타내는 것으로,
추가/삭제/변경을 의미하는 a,d,c가 있다.
a : 추가(added)
d : 삭제(deleted)
c : 변경(changed)
Normal Format: added
추가됨(added)
형태: (1)a[2]
예제: 7a7,8
의미:
원본 파일의 (1)라인 이후에,
새 파일의 범위 [2]만큼의 라인이 추가됨.
Normal Format: changed
변경됨(changed)
형태: [1]c[2]
예제: 5,7c8,10
의미:
원본 파일의 범위 [1]만큼의 라인이,
새 파일의 범위 [2]만큼의 라인으로 변경됨.
Normal Format: deleted
삭제됨(deleted)
형태: [1]d(2)
예제: 5,7d3
의미:
원본 파일의 범위 [1]만큼의 라인이 삭제됨.
새 파일의 (2)라인에 해당함.
Normal Format: 출력 예제(상세)
$ diff foo bar
2c2 # 원본 파일의 2라인이 새 파일의 2라인으로 변경됨
< I am foo. # 원본 파일 라인(삭제됨)
---
> I am bar. # 새 파일 라인(추가됨)
4d3 # 원본 파일의 4라인이 삭제됨
< b
7a7,8 # 원본의 7라인에 새 파일의 7,8라인이 추가됨
> f
> g
Context Format
$ diff -c foo bar
• `-c` 옵션을 사용하며,
변경된 라인 전/후의 라인을 함께 출력한다.
• 변경된 라인의 주변을 확인할 수 있기 때문에,
정확하게 어떤 것이 변경되었는지 파악할 수 있다.
• 주로 소스코드를 배포할 때 사용한다.
• `-C 라인수`, `--context[=라인수]` 옵션으로,
출력할 주변 라인의 개수를 설정할 수 있다.
(기본 3개)
예제 텍스트
<원본 파일:foo>
1 Hello,
2 I am foo.
3 a
4 b
5 c
6 d
7 e
8
<새 파일:bar>
1 Hello,
2 I am bar.
3 a
4 c
5 d
6 e
7 f
8 g
9
Context Format: 출력 예제
$ diff -c foo bar
*** foo 2013-01-29
--- bar 2013-01-29
***************
*** 1,7 ****
Hello,
! I am foo.
a
- b
c
d
e
(좌측에서 계속)
--- 1,8 ----
Hello,
! I am bar,
a
c
d
e
+ f
+ g
Context Format: 출력 예제
$ diff -C 1 foo bar
*** foo 2013-01-29
--- bar 2013-01-29
***************
*** 1,5 ****
Hello,
! I am foo,
a
- b
c
--- 1,4 ----
Hello,
(좌측에서 계속)
! I am bar,
a
c
***************
*** 7 ****
--- 6,8 ----
e
+ f
+ g
Context Format: 출력 형태
• 각 파일의 이름과 수정시각을 나타내는 헤더 이후에,
각 파일에서 변경된 라인 부분을 출력한다.
• 옵션으로 넘긴 라인수만큼(기본 3개),
변경된 라인의 전/후 라인도 함께 출력한다.
*** 원본파일 수정시각
--- 새파일 수정시각
***************
*** 원본 파일 범위 ****
[변경 키워드] 원본 파일 라인
--- 새 파일 범위 ----
[변경 키워드] 새 파일 라인
Context Format: 변경 키워드
• 각 파일에서 변경된 라인은,
변경 키워드와 공백 이후에 출력된다.
변경되지 않은 라인은 2개의 공백 이후 출력한다.
• 변경 키워드는 다음과 같다.
! : 변경됨
+ : 새 파일에 추가됨
- : 원본 파일에서 삭제됨
Context Format: 출력 예제(상세)
$ diff -c foo bar
*** foo 2013-01-29 # 원본 파일의 이름과 수정 시각
--- bar 2013-01-29 # 새 파일의 이름과 수정 시각
***************
*** 1,7 **** # 원본 파일의 1~7라인이 변경됨
Hello,
! I am foo. # 변경된 라인
a
- b # 삭제된 라인
c # 변경된 라인 주변 3라인을 출력 (첫번째 라인)
d # (두번째 라인)
e # (세번째 라인)
Context Format: 출력 예제(상세)
(이전 페이지에서 계속)
--- 1,8 ----
Hello,
! I am bar, # 변경된 라인
a
c # 변경된 라인 전/후로 3라인이 여기까지 겹치므로,
d # 모두 한 번에 출력된다.
e
+ f # 추가된 라인
+ g # 추가된 라인
Context Format: 출력 예제(상세)
$ diff -C 1 foo bar # 주변 라인 1개까지만 출력한다.
*** foo 2013-01-29
--- bar 2013-01-29
***************
*** 1,5 ****
Hello,
! I am foo,
a
- b
c # 변경 라인 이후의 1개 라인만 출력됨
--- 1,4 ----
Hello,
Context Format: 출력 예제(상세)
(이전 페이지에서 계속)
! I am bar,
a
c
***************
*** 7 **** # 주변 라인을 1개만 출력하면 변경 부분이
--- 6,8 ---- # 겹치지 않으므로, 분리해 출력한다.
e # 마찬가지로, 변경 라인 전의 1라인만 출력됨
+ f
+ g # 변경 라인이자 파일의 마지막이다
Unified Format
$ diff -u foo bar
• `-u` 옵션을 사용하며,
`-U 라인수`, `--unified[=라인수]` 옵션으로
주변 라인 개수를 설정할 수 있다.
• Context Format과 비슷하지만,
변경된 부분의 주변 라인의 중복을 제거하고,
두 파일의 변화를 한 번에 볼 수 있어 간략하다.
예제 텍스트
<원본 파일:foo>
1 Hello,
2 I am foo.
3 a
4 b
5 c
6 d
7 e
8
<새 파일:bar>
1 Hello,
2 I am bar.
3 a
4 c
5 d
6 e
7 f
8 g
9
Unified Format: 출력 예제
$ diff -u foo bar
--- foo 2013-01-29
+++ bar 2013-01-29
@@ -1,7 +1,8 @@
Hello,
-I am foo.
+I am bar.
a
-b
c
d
e
(좌측에서 계속)
+f
+g
Unified Format: 출력 예제
$ diff -U 1 foo bar
--- foo 2013-01-29
+++ bar 2013-01-29
@@ -1,5 +1,4 @@
Hello,
-I am foo.
+I am bar.
a
-b
c
@@ -7 +6,3
e
(좌측에서 계속)
+f
+g
Unified Format: 출력 형태
• 각 파일의 이름과 수정시각을 나타내는 헤더 이후에,
두 파일의 변경 부분을 함께 출력한다.
• 변경 부분의 시작에는 각 파일의 변경 범위를 출력하고,
이후에 각 라인이 출력된다.
--- 원본파일 수정시각
+++ 새파일 수정시각
@@ -원본파일범위 +새파일범위 @@
[변경 키워드]각 파일의 라인
Unified Format: 변경 키워드
• 출력되는 각 라인은,
변경된 경우 변경 키워드로 시작하고,
변경되지 않은 경우 공백으로 시작한다.
• 변경 키워드는 다음과 같다.
+ : 새 파일에 추가됨
- : 원본 파일에서 삭제됨
Unified Format: 출력 예제(상세)
$ diff -u foo bar
--- foo 2013-01-29
+++ bar 2013-01-29
@@ -1,7 +1,8 @@ # 원본파일의 1,7라인이
Hello, # 새 파일의 1,8라인으로 변경됨
-I am foo. # 원본 파일에서 삭제되고,
+I am bar. # 새 파일에 추가됨.
a
-b # 변경 키워드 이후에 바로 라인이 출력되고,
c # 변경되지 않은 경우 공백 이후에 출력됨
d
e
Unified Format: 출력 예제(상세)
(이전 페이지에서 계속)
+f
+g
Unified Format: 출력 예제(상세)
$ diff -U 1 foo bar # 주변 라인을 1라인만 출력함
--- foo 2013-01-29
+++ bar 2013-01-29
@@ -1,5 +1,4 @@
Hello,
-I am foo.
+I am bar.
a
-b
c # 변경 라인 이후 1개 라인까지만 출력
@@ -7 +6,3 # 주변 라인의 개수가 1라인이므로,
e # 변경 부분을 분리해서 출력함
Unified Format: 출력 예제(상세)
(이전 페이지에서 계속)
+f
+g
정리
• diff의 대표적인 출력 포맷은 다음과 같다.
Normal Format: diff foo bar
Context Format: diff -c foo bar
Unified Format: diff -u foo bar
참고
• http://unixhelp.ed.ac.uk/CGI/man-cgi?diff
• http://en.wikipedia.org/wiki/Diff
• http://www.chemie.fu-berlin.de/chemnet/use/info/diff/diff_3.html#SEC10