우분투 실전 명령어 | comm으로 파일 차이와 공통 라인 빠르게 비교
우분투 실전 명령어 | comm으로 파일 차이와 공통 라인 빠르게 비교
설정 파일 두 버전이나 배포 전후 목록을 비교할 때 diff 결과가 너무 장황하면 핵심이 묻히기 쉽습니다. comm은 정렬된 두 파일을 기준으로 "왼쪽만", "오른쪽만", "공통" 라인을 세 갈래로 바로 나눠 보여줘서 운영 점검에 특히 편합니다.
언제 쓰는가
- 배포 전후 패키지 목록, 계정 목록, 허용 IP 목록 차이를 빠르게 점검할 때
- 두 서버에서 수집한 결과 파일 중 어느 쪽에만 있는 항목인지 확인할 때
- 공통 항목만 뽑아 후속 작업 입력으로 넘기고 싶을 때
바로 쓰는 명령어
# 1) 기본 비교: 1열(파일1만), 2열(파일2만), 3열(공통)
sort old.txt > old.sorted
sort new.txt > new.sorted
comm old.sorted new.sorted
# 2) 공통 라인만 출력
comm -12 old.sorted new.sorted
# 3) 새 파일에만 추가된 라인만 출력
comm -13 old.sorted new.sorted
# 4) 기존 파일에서 사라진 라인만 출력
comm -23 old.sorted new.sorted
핵심 옵션/패턴
- 입력 파일은 반드시 정렬 상태여야 한다. 보통
sort를 먼저 붙여 쓴다. -1,-2,-3는 해당 열 숨김 옵션이다.comm -12 a b: 공통만 출력comm -13 a b: 두 번째 파일 전용(신규)만 출력comm -23 a b: 첫 번째 파일 전용(삭제 후보)만 출력
명령 출력 예시
$ cat old.sorted
api
batch
cache
queue
$ cat new.sorted
api
cache
search
worker
$ comm old.sorted new.sorted
api
batch
cache
queue
search
worker
$ comm -13 old.sorted new.sorted
search
worker
$ comm -23 old.sorted new.sorted
batch
queue
자주 하는 실수
- 정렬하지 않은 파일을 바로 넣고 결과를 믿어버림
comm: file 1 is not in sorted order경고가 뜨면 먼저 정렬부터 해야 한다.
- 파일 인코딩이나 공백 문자가 달라서 같은 항목이 다른 줄로 잡힘
- 점검 전에
sed -e 's/[[:space:]]\+$//'같은 정리 과정을 넣는 게 안전하다.
- 점검 전에
- 대소문자 혼용 데이터를 그대로 비교해 누락을 놓침
- 필요하면
tr '[:upper:]' '[:lower:]'로 정규화하고 비교한다.
- 필요하면
검증 방법
# 1) 샘플 데이터로 신규/삭제 항목 확인
printf "api\nbatch\ncache\n" | sort > a.txt
printf "api\ncache\nworker\n" | sort > b.txt
comm -13 a.txt b.txt # 기대값: worker
comm -23 a.txt b.txt # 기대값: batch
comm -12 a.txt b.txt # 기대값: api, cache
# 2) 파이프라인 검증: 공통 항목 개수 확인
common_count=$(comm -12 a.txt b.txt | wc -l)
echo "common_count=$common_count"
운영 팁
운영 자동화에서는 comm -13 결과를 "신규 반영 대상"으로, comm -23 결과를 "정리 후보"로 분리해 로그에 남기면 변경 추적이 깔끔해진다. 대규모 목록 비교라면 비교 전 정규화 스텝(정렬, 공백 제거, 소문자화)을 함수로 고정해 두는 편이 실수 방지에 효과적이다.
출처
- GNU Coreutils comm 문서
- Ubuntu manpage comm
- POSIX comm specification