uniq 명령어 사용법

정렬된 입력에서 인접한 중복 줄을 제거하거나 횟수를 세는 명령어입니다.

텍스트 처리연결 실습 문제 3개Rocky Linux 8 기준 · 실행 결과는 실습 컨테이너에서 확인

기본 문법

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
--versioncoreutils의 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 · 내용에 오류가 있으면 문제 페이지의 질문 기능으로 알려 주세요.