기본 문법
uniq [옵션] [입력파일 [출력파일]]
uniq는 입력에서 서로 이웃한 동일한 줄을 하나로 묶어 출력하는 명령어입니다. 파일이나 파이프로 들어온 텍스트를 위에서 아래로 훑으면서 바로 앞 줄과 같은 줄을 발견하면 중복으로 처리합니다. 핵심은 '인접한' 줄만 비교한다는 점으로, 같은 값이 파일 곳곳에 흩어져 있으면 중복으로 인식하지 못합니다. 그래서 실무에서는 대부분 `sort 파일 | uniq` 형태로 정렬과 함께 사용합니다.
주로 쓰이는 용도는 목록에서 중복을 없애는 것과, -c 옵션으로 값별 등장 횟수를 세는 것입니다. 로그 분석에서 IP별·URL별·상태 코드별 요청 수를 집계할 때 `sort | uniq -c | sort -rn` 조합을 자주 사용합니다. 또 -d로 두 번 이상 나온 값만 골라내거나 -u로 한 번만 나온 값을 뽑아 데이터를 점검할 수 있습니다.
리눅스마스터·LPIC 등 시험에서는 sort와 묶여 출제되며, `sort -u`와 `sort | uniq`의 차이, uniq 단독 사용 시 왜 중복이 남는지를 묻는 문제가 나옵니다. 러닉스 실습에서는 사용자 목록 중복 제거(#129), 실패 로그인 계정 추출(#130), 접속 상위 IP 집계(#197) 문제에서 사용됩니다.
자주 쓰는 옵션
| 옵션 | 의미 | 예 |
|---|---|---|
-c | 각 줄 앞에 등장 횟수를 붙여 출력 | sort access.log | uniq -c |
-d | 두 번 이상 나온 줄만 한 번씩 출력 (한 번만 나온 줄 제외) | sort users.txt | uniq -d |
-D | 중복된 줄을 하나로 합치지 않고 해당 줄 전부를 출력 | sort users.txt | uniq -D |
-u | 한 번만 나온 줄만 출력 (중복된 줄 제외) | sort users.txt | uniq -u |
-i | 대소문자를 구분하지 않고 비교 (정렬도 sort -f로 맞춰야 인접하게 모임) | sort -f names.txt | uniq -i |
-f N | 앞의 N개 필드를 건너뛰고 비교 | sort data.txt | uniq -f 1 |
-s N | 앞의 N개 문자를 건너뛰고 비교 | sort log.txt | uniq -s 8 |
-w N | 각 줄에서 앞 N개 문자까지만 비교 | sort ids.txt | uniq -w 3 |
--version | coreutils의 uniq 버전 정보 출력 | uniq --version |
실무 예시
인접 중복만 제거된다는 것 확인
준비: mkdir -p /tmp/demo; printf 'apple\napple\nbanana\napple\n' > /tmp/demo/fruit.txt
$ uniq /tmp/demo/fruit.txt
apple
banana
apple
연속된 apple 두 줄만 하나로 합쳐지고, 떨어져 있는 마지막 apple은 그대로 남습니다. uniq가 인접 비교만 한다는 점을 보여줍니다.
sort와 함께 완전한 중복 제거
준비: mkdir -p /tmp/demo; printf 'apple\napple\nbanana\napple\n' > /tmp/demo/fruit.txt
$ sort /tmp/demo/fruit.txt | uniq
apple
banana
먼저 정렬해 같은 값을 붙여 놓으면 uniq가 모든 중복을 제거합니다. 실습 #129의 기본 형태입니다.
사용자 목록 정렬·중복 제거 후 저장
준비: mkdir -p /tmp/demo; printf 'bob\nalice\nbob\ncarol\nalice\n' > /tmp/demo/users.txt
$ sort /tmp/demo/users.txt | uniq > /tmp/demo/users_clean.txt; cat /tmp/demo/users_clean.txt
alice
bob
carol
정렬 후 중복을 제거한 결과를 새 파일로 저장합니다. 리다이렉션 대상 파일은 원본과 달라야 하며, 원본을 지정하면 내용이 비워집니다.
값별 등장 횟수 세기
준비: mkdir -p /tmp/demo; printf '10.0.0.1\n10.0.0.2\n10.0.0.1\n10.0.0.3\n10.0.0.1\n10.0.0.2\n' > /tmp/demo/ips.txt
$ sort /tmp/demo/ips.txt | uniq -c
3 10.0.0.1
2 10.0.0.2
1 10.0.0.3
각 IP가 몇 번 나왔는지 줄 앞에 횟수가 붙어 출력됩니다. 횟수는 공백으로 채워 오른쪽 정렬된 형태입니다.
로그에서 Top3 IP 집계
준비: mkdir -p /tmp/demo; printf '10.0.0.1 - GET /\n10.0.0.2 - GET /a\n10.0.0.1 - GET /b\n10.0.0.3 - GET /\n10.0.0.1 - GET /c\n10.0.0.2 - GET /d\n' > /tmp/demo/access.log
$ awk '{print $1}' /tmp/demo/access.log | sort | uniq -c | sort -rn | head -3 | awk '{print $2, $1}'
10.0.0.1 3
10.0.0.2 2
10.0.0.3 1
IP만 뽑아 집계한 뒤 횟수 기준 내림차순으로 정렬해 상위 3개를 '<IP> <COUNT>' 형식으로 출력합니다. 실습 #197의 전형적인 풀이입니다.
중복된 값과 한 번만 나온 값 구분
준비: mkdir -p /tmp/demo; printf 'bob\nalice\nbob\ncarol\n' > /tmp/demo/users.txt
$ sort /tmp/demo/users.txt | uniq -d; echo '---'; sort /tmp/demo/users.txt | uniq -u
bob
---
alice
carol
-d는 두 번 이상 나온 값만, -u는 한 번만 나온 값만 출력합니다. 데이터 중복 점검에 사용합니다.
주의할 점
- uniq는 인접한 줄만 비교합니다. 정렬하지 않고 쓰면 흩어진 중복이 그대로 남으므로 sort와 함께 쓰세요.
- `sort file | uniq > file`처럼 원본 파일로 리다이렉션하면 셸이 먼저 파일을 비우기 때문에 내용이 사라집니다. 반드시 다른 이름으로 저장하세요.
- uniq -c 결과에는 줄 앞에 공백과 숫자가 붙습니다. '<IP> <COUNT>' 형식이 필요하면 awk 등으로 재배치해야 합니다.
- 줄 끝 공백이나 대소문자가 다르면 다른 줄로 취급됩니다. 대소문자 무시가 필요하면 `sort -f`와 `uniq -i`를 함께 쓰세요.
- -f, -s, -w는 비교 대상만 바꿀 뿐 출력 내용은 원본 줄 전체입니다.
이 명령어로 풀 수 있는 실습 문제
브라우저 웹 터미널에서 바로 풀고 요구사항별로 자동 채점됩니다. 로그인 없이 5분 체험도 가능합니다.
관련 명령어
마지막 검수 2026-09-16 · 내용에 오류가 있으면 문제 페이지의 질문 기능으로 알려 주세요.
