본문 바로가기

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

[리눅스/유닉스] comm 명령어 사용법과 diff와 차이 알아보자, 두 파일 비교하기 중복 제거하기

반응형

[리눅스/유닉스 완전정복 목차]

 

안녕하세요~!

오늘은 알아두면 유용하게 사용할 수 있는 comm 명령어에 대해 끄적여보려고 합니다. 

 

comm 명령어와 diff 명령어 차이

보통 업무를 하다보면, 소스던 텍스트파일이던 비교를 해야하는 경우가 있는데요 

어떤 부분이 추가되었는지 어떤 부분이 삭제되었는지 달라진점을 확인하는데 주로 사용하는 명령어는 diff죠~~!

 

▼ diff 명령어 사용법이 궁금하신 분은 아래 포스팅 참고

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

 

만약 현재 소스 리스트와 작년 소스 리스트를 비교해야하는 업무가 생겼다고 가정합시다.

1년 사이에 신규소스가 생성되었을 수도 있고, 사용되지 않는 모듈은 삭제되었을 수도 있겠죠~~!

src_list_2021.txt, src_list_2022.txt

[삭제된파일] 2022년도 소스파일에서는 0004 소스가 삭제되었어요!

[변경된파일] 그리고 2021년도에 stduent로 잘못되어있는 소스명을 2022에서는 student로 변경했네요.

[중복된파일] 0002, 0003은 2021년도에도, 2022년도에도 모두 존재하는 파일임을 알 수 있습니다.

[추가된파일] 그리고 0005 소스는 신규소스네요.

diff를 썼을 때

이렿게 있다고 했을 때 diff 명령어를 한 번 사용해볼까요?

변경된거 삭제된거 추가된게 한 번에 다 나왔어요. 즉 diff는 변경사항이 있으면 이를 한 번에 확인할 때 좋습니다.

또 diff 특징이 만약에 순서가 다르다..!

0002student.c가 2021파일에도 있고 2022파일에도 있는데 만약에 순서가 다른데 위치한다 하면, 변경된점으로 인식합니다. 위의 예시 사진을 보면 2021파일에서 002와 003순서를 바꿔버렸어요. 그랬더니 diff했을 때 아까랑 다르게 0003이 들어간 것을 확인할 수 있습니다.

 

그런데 순서상관없이 중복된 소스 목록만 보고 싶으면 어떻게 하나요?? 

또는 삭제된거 말고 추가된 소스들만 확인하고 싶다면??

반대로 삭제된 소스들이 어떤건지 궁금하다면~? 

똑같은 것들만 제외하고 싶다면..!!

 

diff 명령어의 경우 요런 목적으로 활용하기엔 좀 한계가 있겠죠.

이렇게 라인단위로 (리스트같은 경우) 비교하고 싶을 때에는 comm이라는 명령어를 사용하면 유용합니다. (compare 할 때 comm이예요)

comm명령어가 뭔지 한 번 자세히 알아봅시당~~~~~

 

[요약]

■ diff

변경된 부분을 한번에 비교하고 싶을 때

ex) 내용물을 비교하고 싶을 때, 수정부분 이력을 확인하고 싶을 때

 

 comm

순서 상관없이 추가된 부분, 삭제된 부분 또는 중복된 부분만 목록으로 비교하고 싶을 때

ex) 전화번호 비교, 소스파일 목록 비교 등등

 

comm 명령어란 무엇인가, comm 명령어 문법!

commpare two sorted files line by line

정렬된 파일들을 라인 단위로 비교한다.

라고 적혀있네요~

 

또 주의해야할 점은, 비교할 파일들이 사전식(알파벳순)으로 정렬되어있어야 합니다.

그래서 순서가 중요하지 않은 목록들을 비교할 때 좋다고 한 것!

 

[기본 문법]

기본 사용법

옵션 없이 치면 결과는 위와 같습니다.

총 3개의 열이 있는데요 comm FILE1 FILE2 했을 때 

 

첫 번째 열은 FILE1에만 있는거

두 번째 열은 FILE2에만 있는거 

3번째 열은 두 파일 모두 공통으로 있는 것!

 

comm 명령어 옵션

옵션을 잘 알아야 유용하게 사용할 수 있는데요.

일단 중요한 옵션으로는 -1, -2, -3이 있어요. 

마찬가지로 comm FILE1 FILE2이라 했을 때~

 

■ -1

suppress colum 1 (lines unique to FILE1)

기본 사용법에서 열이 3개라고 했었죠? 그 3개 열중에 첫 번째 열 제거

즉 두 번째 열과 세 번째 열만 출력

 

■ -2

suppress colum 2 (lines unique to FILE2)

3개 열 중 두 번째 열에 있던 것 제거 (FILE2에만 있던 목록 제거)

2파일에만 있는 것을 첫번째 열에 출력 + 공통부분을 두 번째 열에 출력

 

■ -3

suprress column 3 (lines that appear in both files)

3번째 열 제거 - 두 파일에 공통으로 나타는 라인들을 제거해서 각 파일에 출력

→ 즉 1파일에만 있는 것 + 2파일에만 있는 것

원리를 알고 나니 이해하기 어렵지 않죠~?

각 옵션들을 테스트해봤는데요, 결과를 잘 보시면 쉽게 이해하실 수 있습니다. 

 

[comm 옵션 함께쓰기]

요 옵션들은 단독으로 쓰일 수도 있고 같이 쓰일 쓰도 있어요.

솔직히 같이 썼을 때 더 활용도가 높은 것 같아요.

 

1열: FILE1에만 있는거
2열: FILE2에만 있는거
3열: 공통!

중요하니까 다시 반복해봤어요 ㅋㅋ

 

옵션이 두개여도 원리는 똑같아요.

comm -12 하면 1열과 2열을 제외하는거니까 공통만 냄기는거고

comm -23 하면 2열과 3열을 제외하는거니까 FILE1에만 있는걸 냄기는거고

comm -13하면 1열과 3열을 제외하는거니까 FILE2에만 존재하는 목록들인거죠~

 

짠 공통부분만 출력된 것을 확인할 수 있어요.

 

comm 활용 응용예시

만약에 정렬이 되어있지 않은 파일일 경우, 어떻게 쓰나요??

 

■ comm명령어와 sort 명령어 한 번에 쓰기

bash shell 기준으로 하면 <() 명령어를 활용해서 한 번에 처리하면 됩니다.

'<(command)'구문은 괄호안에 있는 command의 결과를 다른 명령어의 인자로 쓸 수 있게끔 도와주는(?) 문법이예요.

파이프라인(|)을 사용하기에 애매할 때 주로 써요 

파이프라인은 결과를 인풋으로 쓰는거라 명령어의 끝에 사용되니까요 ( ex cat test.txt | grep "hello") 

 

중복을 제거하고 싶을 때

2022파일이 있고, 제거해야할 대상 소스 파일이 있다고 가정합시다.

예를 들면 요렇게~ 결과를 뽑고 싶을 경우 어떻게 하시겠어요?

 

2022에만 있는 걸 출력하면 되겠죠? 

comm -2 FILE1 FILE2하면 FILE2에만 있는 항목(m0004student.c)을 제거하는거고

comm -3 FILE1 FILE2하면 공통항목(m0002student.c, m0003student.c)를 제거하는거니까

정답은 comm -23 해주면 됩니당~ 

comm -2하면 2번 파일을 제거한다라고 생각해서 comm -2로 생각하기 쉬운데,

comm -2옵션은 2번파일에만 있는 항목을 제거하는거라 꼭 공통항목도 같이 제거해줘야 한다는거~

위 결과를 보면 잘 뽑힌 것을 확인할 수 있습니다.

 

오늘은 이렇게 diff 명령어와는 또 다른 comm 명령어에 대해 알아봤어요~

도움이 되었다면 공감은 어떤가요? 작성자에게 큰 힘이 됩니다. 

반응형