Linux / 명령어 / uniq - 인접한 중복 행 정리

uniq는 바로 이웃한 같은 행을 하나로 줄이거나 반복 횟수를 표시합니다. 전체 파일의 중복값을 제거하려면 보통 먼저 정렬해야 합니다.

uniq 명령어란?

서로 떨어진 동일 행은 uniq만으로 제거되지 않습니다. 입력 순서를 유지해야 한다면 무조건 정렬하지 말고 필요한 중복의 의미를 먼저 정하세요. 정렬 후 uniq를 쓰면 원래 행 순서는 바뀝니다.

기본 문법

uniq [옵션] [입력파일 [출력파일]]

설치된 구현과 옵션은 배포판에 따라 다를 수 있습니다. man uniq으로 현재 시스템의 설명을 확인하세요.

사용 예제

인접 중복 제거

같은 행이 연속될 때 첫 행만 출력합니다.

uniq events.txt

전체 중복값 세기

정렬로 같은 값을 모은 뒤 -c로 반복 횟수를 표시합니다.

sort names.txt | uniq -c

중복된 값만 확인

두 번 이상 연속된 값의 종류를 출력합니다.

sort names.txt | uniq -d

인접한 중복과 전체 중복 구별하기

uniq는 연속된 동일 행만 묶습니다. 아래에서는 마지막 apple이 앞의 두 행과 떨어져 있으므로 별도로 남습니다.

printf 'apple\napple\nbanana\napple\n' | uniq -c

예시 출력(숫자 앞 공백은 구현에 따라 다를 수 있음):

2 apple
1 banana
1 apple

파일 전체의 동일 행을 하나로 묶으려면 정렬 후 sort 파일 | uniq을 사용합니다. 다만 정렬은 원래 행 순서를 바꾸므로, 입력 순서가 중요한 로그나 이벤트 기록에는 무조건 적용하지 마세요. -d는 중복된 그룹만, -u는 한 번만 나타난 그룹만 표시합니다.

주요 옵션과 형식

옵션·형식 설명
-c 각 출력 행 앞에 연속 발생 횟수를 붙입니다.
-d 중복된 행만 출력합니다.
-u 한 번만 나타난 행만 출력합니다.
-i 비교할 때 대소문자를 무시합니다.
-f N 앞쪽 N개 필드를 비교에서 제외합니다.

사용할 때 주의할 점

sort | uniq에서는 로케일에 따라 정렬·비교 결과가 달라질 수 있습니다. 정확한 바이트 기준 집계가 필요하면 두 명령에 같은 LC_ALL=C 환경을 적용하세요. uniq -u는 모든 고유값이 아니라 단 한 번만 나온 행을 뜻합니다.

자주 묻는 질문

uniq가 떨어진 중복 행을 지우지 않는 이유는?

현재 행을 바로 앞 행과 비교하는 방식이기 때문입니다. 전체 중복 제거에는 입력을 정렬해 같은 행을 모으세요.

공식 문서

옵션의 정확한 동작과 구현별 차이는 uniq 관련 공식 문서에서 확인할 수 있습니다.

같은 카테고리의 다른 글
Linux 강좌 / 배포판 선택하기

Linux 강좌 / 배포판 선택하기

리눅스 입문과 서버 실습에 Ubuntu와 Rocky Linux 중 무엇을 선택하면 좋을까요? 학습 목표, 패키지 관리 방식과 지원 정책을 기준으로 두 배포판을 비교합니다.

Linux 강좌 / 파일 권한 읽고 바꾸기와 sudo 사용법

Linux 강좌 / 파일 권한 읽고 바꾸기와 sudo 사용법

리눅스 파일과 디렉터리의 읽기·쓰기·실행 권한을 해석하고 chmod로 실습 파일의 권한을 바꿉니다. sudo의 사용 범위와 권한 오류를 진단하는 순서도 설명합니다.

Linux / 명령어 / chmod - 파일·디렉터리 접근 권한 변경

Linux / 명령어 / chmod - 파일·디렉터리 접근 권한 변경

Linux chmod 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux 강좌 / 리눅스란 무엇인가? 커널, 배포판, 오픈 소스 이해하기

Linux 강좌 / 리눅스란 무엇인가? 커널, 배포판, 오픈 소스 이해하기

리눅스 커널과 배포판은 어떻게 다를까요? 사용자 공간과 오픈 소스의 의미를 구분하고, 현재 시스템의 커널·배포판 정보를 확인하는 방법을 알아봅니다.

Linux 강좌 / 하드 링크와 심볼릭 링크 이해하기 - 차이와 생성 실습

Linux 강좌 / 하드 링크와 심볼릭 링크 이해하기 - 차이와 생성 실습

하드 링크와 심볼릭 링크의 구조적 차이를 inode와 경로로 설명하고, 링크를 직접 만들어 이름 변경 후 동작까지 확인합니다.

Linux / 명령어 / csplit - 행 번호·패턴에서 파일 분할

Linux / 명령어 / csplit - 행 번호·패턴에서 파일 분할

Linux csplit 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / rpm - RPM 패키지와 설치 데이터베이스 조회

Linux / 명령어 / rpm - RPM 패키지와 설치 데이터베이스 조회

Linux rpm 명령어의 적용 배포판과 기본 작업을 설명합니다. 패키지 조회·설치 예제, 주요 옵션과 시스템 변경 시 주의점을 알아봅니다.

Linux / 명령어 / mv - 파일 이동과 이름 변경

Linux / 명령어 / mv - 파일 이동과 이름 변경

Linux mv 명령어로 파일과 디렉터리를 이동하거나 이름을 변경하는 방법을 설명합니다. 덮어쓰기 방지, 파일 시스템 간 이동과 안전한 자동화 방법도 정리합니다.

Linux / 명령어 / mktemp - 안전한 임시 파일과 디렉터리 생성

Linux / 명령어 / mktemp - 안전한 임시 파일과 디렉터리 생성

Linux mktemp 명령어로 예측하기 어려운 이름의 임시 파일과 디렉터리를 안전하게 만드는 방법을 설명합니다. 템플릿, TMPDIR, trap을 이용한 정리와 -u 옵션의 위험도 알아봅니다.

Linux / 명령어 / journalctl - systemd 시스템·서비스 로그 조회

Linux / 명령어 / journalctl - systemd 시스템·서비스 로그 조회

Linux journalctl 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.