기본 문법
sort [옵션] [파일...]
sort는 입력의 각 줄을 기준에 따라 순서대로 재배열해 표준 출력으로 내보내는 명령어입니다. 기본값은 로캘 기준 사전순 오름차순이며, 옵션으로 숫자순, 역순, 특정 필드 기준, 사람이 읽기 쉬운 크기 단위(K, M, G) 기준 정렬 등을 지정할 수 있습니다. 원본 파일은 변경하지 않고 결과만 출력하므로, 저장하려면 리디렉션이나 -o 옵션을 써야 합니다.
로그·목록·CSV 같은 텍스트 데이터를 다룰 때 자주 쓰입니다. uniq는 인접한 줄만 중복으로 인식하므로, 중복을 제거하려면 sort로 먼저 정렬한 뒤 uniq를 적용하거나 sort -u를 사용합니다. du 결과를 크기순으로 보거나, grep·cut·awk로 추출한 값을 정리할 때도 파이프의 마지막 단계에 놓이는 경우가 많습니다.
리눅스마스터·LPIC 등 시험에서는 -n, -r, -u, -k, -t 옵션의 의미와 sort | uniq 조합이 자주 출제됩니다. 러닉스 실습에서도 사용자 목록 정렬, 오류 경로 추출, 포트 번호 오름차순 정렬처럼 다른 명령과 연결해 쓰는 형태로 다룹니다.
자주 쓰는 옵션
| 옵션 | 의미 | 예 |
|---|---|---|
-n | 줄 앞부분의 숫자 값을 수의 크기로 비교해 정렬 | sort -n ports.txt |
-r | 비교 결과를 뒤집어 역순(내림차순)으로 출력 | sort -nr sizes.txt |
-u | 정렬 키가 같은 줄은 하나만 남김 | sort -u users.txt |
-k | 정렬 기준이 되는 필드(열) 범위 지정. 예: -k2,2는 2번째 필드만 기준으로 사용 | sort -k2,2n data.txt |
-t | 필드 구분 문자 지정. 지정하지 않으면 공백이 아닌 문자 앞의 빈 칸 경계를 구분점으로 사용 | sort -t: -k3,3n /etc/passwd |
-o | 결과를 지정한 파일에 저장. 입력 파일과 같은 이름을 지정해도 내용이 보존됨 | sort -o users.txt users.txt |
-f | 비교할 때 소문자를 대문자로 취급해 대소문자를 구분하지 않음 | sort -f names.txt |
-h | 1K, 2M 같은 사람이 읽는 크기 단위를 해석해 크기순으로 정렬 | du -h | sort -h |
-b | 비교 시 필드 앞쪽의 공백을 무시 | sort -b list.txt |
-c | 정렬 여부만 검사하고 출력하지 않음. 정렬되어 있지 않으면 첫 위반 줄을 알리고 종료 코드 1을 반환 | sort -c users.txt |
실무 예시
기본 사전순 정렬
준비: mkdir -p /tmp/demo; printf 'banana\napple\ncherry\napple\n' > /tmp/demo/fruits.txt
$ sort /tmp/demo/fruits.txt
apple
apple
banana
cherry
옵션 없이 실행하면 로캘 기준 사전순 오름차순으로 정렬되며, 중복된 줄은 그대로 남습니다.
정렬 후 중복 제거
준비: mkdir -p /tmp/demo; printf 'student\nroot\nbackup\nroot\nstudent\n' > /tmp/demo/users.txt
$ sort -u /tmp/demo/users.txt > /tmp/demo/users_clean.txt; cat /tmp/demo/users_clean.txt
backup
root
student
-u는 정렬과 중복 제거를 한 번에 처리합니다. 이 예시처럼 줄 전체를 기준으로 비교할 때는 sort file | uniq 와 결과가 같습니다.
숫자순 정렬과 역순
준비: mkdir -p /tmp/demo; printf '100\n9\n25\n3\n' > /tmp/demo/nums.txt
$ sort -n /tmp/demo/nums.txt; echo '---'; sort -nr /tmp/demo/nums.txt
3
9
25
100
---
100
25
9
3
-n을 빼면 사전순으로 비교해 100이 9보다 앞에 옵니다. -r을 더하면 내림차순이 됩니다.
구분자와 필드 기준 정렬
준비: mkdir -p /tmp/demo; printf 'http,tcp,80\nssh,tcp,22\ndns,udp,53\nhttps,tcp,443\n' > /tmp/demo/services.csv
$ grep ',tcp,' /tmp/demo/services.csv | sort -t, -k3,3n | cut -d, -f1,3 | tr ',' ':'
ssh:22
http:80
https:443
쉼표를 구분자로 삼아 3번째 필드(포트)를 숫자순으로 정렬한 뒤 name:port 형식으로 바꿉니다.
로그에서 값 추출 후 정렬
준비: mkdir -p /tmp/demo; printf 'GET /a 200\nGET /err 500\nGET /b 404\nGET /err 503\nGET /db 500\n' > /tmp/demo/http.log
$ awk '$3 >= 500 {print $2}' /tmp/demo/http.log | sort -u > /tmp/demo/error_paths.txt; cat /tmp/demo/error_paths.txt
/db
/err
상태 코드가 500 이상인 줄의 경로만 뽑아 중복 없이 정렬해 저장합니다. 러닉스 실습 #165와 같은 흐름입니다.
주의할 점
- sort는 원본 파일을 바꾸지 않습니다. 저장하려면 리디렉션하거나 -o 옵션을 쓰세요.
- 같은 파일에 `sort f > f` 로 리디렉션하면 셸이 먼저 파일을 비우므로 내용이 사라집니다. `sort -o f f` 를 쓰세요.
- uniq는 인접한 중복만 제거하므로 sort로 먼저 정렬한 뒤 연결해야 합니다.
- -n 없이 숫자를 정렬하면 사전순 비교라 100이 9보다 앞에 옵니다. K·M·G 같은 크기 단위가 붙은 값은 -h를 쓰세요.
- 정렬 순서는 로캘(LC_ALL, LC_COLLATE)에 영향을 받습니다. 스크립트에서 환경과 무관한 일정한 순서가 필요하면 LC_ALL=C sort 처럼 로캘을 고정하세요.
- /etc/passwd 같은 시스템 파일을 정렬해 볼 때는 출력만 확인하고, -o 로 원본을 덮어쓰지 마세요.
이 명령어로 풀 수 있는 실습 문제
브라우저 웹 터미널에서 바로 풀고 요구사항별로 자동 채점됩니다. 로그인 없이 5분 체험도 가능합니다.
관련 명령어
마지막 검수 2026-09-16 · 내용에 오류가 있으면 문제 페이지의 질문 기능으로 알려 주세요.
