우분투 실전 명령어 | sort·uniq 중복 빈도 분석

대량 로그에서 중복 패턴을 빠르게 찾을 때 sortuniq 조합이 가장 단순하고 강력합니다. 에러 코드, IP, 요청 경로처럼 반복되는 값을 빈도순으로 뽑아 보면 장애 원인 후보를 몇 분 안에 좁힐 수 있습니다.

언제 쓰는가

로그나 텍스트 덤프에서 “무엇이 가장 많이 반복됐는지” 먼저 확인해야 할 때 씁니다. 예를 들어 500 에러 상위 경로, 로그인 실패 상위 계정, 트래픽 상위 IP를 빠르게 추려 1차 대응 방향을 정할 때 유용합니다.

바로 쓰는 명령어

# 1) access.log에서 요청 경로 상위 20개
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -20

# 2) auth.log에서 로그인 실패 계정 상위 10개
grep 'Failed password for' /var/log/auth.log \
  | awk '{print $(NF-5)}' \
  | sort | uniq -c | sort -nr | head -10

# 3) 에러 코드 빈도 집계
awk '{print $9}' access.log | grep -E '^[0-9]{3}$' | sort | uniq -c | sort -nr
# 상위 IP 빈도 + 보기 좋은 정렬
awk '{print $1}' access.log | sort | uniq -c | sort -nr | column -t | head

# 대소문자 차이를 무시하고 중복 제거
cat events.txt | tr 'A-Z' 'a-z' | sort | uniq -ci | sort -nr | head

핵심 옵션/패턴

  • uniq -c: 각 라인 등장 횟수를 앞에 붙여 줍니다.
  • uniq -d: 중복된 라인만 출력합니다.
  • sort -u: 정렬과 중복 제거를 한 번에 처리합니다.
  • sort -nr: 숫자 내림차순 정렬로 상위 빈도를 먼저 확인합니다.
  • 핵심은 uniq 전에 반드시 sort를 넣는 것입니다. 정렬되지 않으면 같은 값이 떨어져 있어 집계가 틀어집니다.

명령 출력 예시

$ awk '{print $9}' access.log | sort | uniq -c | sort -nr | head
  842 200
  131 404
   55 500
   22 301
$ awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -5
  512 10.0.1.24
  301 10.0.1.10
  214 10.0.1.7
   89 10.0.1.44
   57 10.0.1.51

자주 하는 실수

  • uniq -c만 단독으로 실행해서 잘못된 빈도표를 얻는 경우가 많습니다. 정렬 없는 uniq는 인접한 중복만 셉니다.
  • 공백이 많은 로그에서 필드 위치를 고정으로 가정해 awk 컬럼을 잘못 뽑는 실수가 자주 납니다. 샘플 5줄을 먼저 보고 필드 인덱스를 확정하세요.
  • 용량 큰 파일을 바로 전체 정렬해 서버 I-O를 압박하는 경우가 있습니다. 먼저 head, 시간 구간 필터링, 임시 파일 분할로 범위를 줄이는 게 안전합니다.

검증 방법

# 1) 상위 집계 합계와 원본 라인 수 비교
wc -l access.log
awk '{print $1}' top_ip.txt | paste -sd+ - | bc

# 2) 중복 집계 전/후 샘플 교차 확인
awk '{print $1}' access.log | head -20
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head

# 3) 특정 값 실제 출현 횟수 대조
grep -c '10.0.1.24' access.log

운영 팁

운영 환경에서는 전체 로그를 한 번에 다루기보다, 먼저 최근 10분·1시간 등 시간 구간을 좁혀 상위 패턴을 확인하는 습관이 좋습니다. 상위 항목을 뽑은 뒤 해당 값으로 재필터링해 원문 로그를 보는 2단계 접근을 쓰면 원인 파악 속도가 훨씬 빨라집니다.

출처

Ubuntu Manpage
GNU Coreutils Manual