우분투 실전 명령어 | sort, uniq로 로그 빈도 상위값 빠르게 찾기

언제 쓰는가

로그나 텍스트 데이터에서 어떤 값이 가장 많이 나오는지 빠르게 확인할 때 씁니다.
접속 IP 상위 목록, 에러 코드 빈도, 사용자 행동 패턴처럼 빈도 기반으로 우선순위를 정해야 할 때 특히 유용합니다.
awk로 집계 코드를 길게 짜기 전에 sort, uniq 조합으로 먼저 현황을 보는 습관이 실무에서 시간을 많이 아껴줍니다.

바로 쓰는 명령어

# nginx access.log에서 접속 IP 상위 20개
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20

# 에러 로그에서 에러 레벨별 빈도 확인
grep -Eo "ERROR|WARN|INFO" /var/log/myapp/app.log | sort | uniq -c | sort -nr
# 중복 라인 제거 후 고유 값만 저장
sort /tmp/raw-users.txt | uniq > /tmp/unique-users.txt

# 대소문자 무시하고 중복 집계
cat /tmp/events.txt | tr '[:upper:]' '[:lower:]' | sort | uniq -c | sort -nr | head

핵심 옵션/패턴

  • uniq -c: 같은 라인의 개수를 앞에 붙여서 보여줍니다.
  • sort -nr: 숫자 기준 역순 정렬이라 빈도 높은 항목을 위로 올릴 때 기본 패턴입니다.
  • uniq는 인접한 중복만 처리하므로, 집계 전 sort를 먼저 거는 순서를 지켜야 합니다.
  • 공백이 많은 로그 필드는 awk '{print $1}', cut -d' ' -fN으로 먼저 열을 정리한 뒤 집계하면 결과가 깔끔해집니다.
  • 큰 파일에서는 전체 파일을 매번 읽기보다 tail -n 50000처럼 최근 구간만 잘라서 빠르게 1차 분석하는 방식이 실용적입니다.

명령 출력 예시

$ awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -5
  1842 10.10.2.15
   977 192.168.0.21
   615 203.0.113.44
   214 127.0.0.1
   109 10.10.2.16
$ grep -Eo "ERROR|WARN|INFO" /var/log/myapp/app.log | sort | uniq -c | sort -nr
  421 INFO
   97 WARN
   13 ERROR

자주 하는 실수

  • uniq -c만 단독으로 실행해서 중복이 제대로 안 잡히는 경우가 많습니다. 정렬 없이 쓰면 떨어져 있는 같은 값은 다른 항목으로 계산됩니다.
  • 숫자 정렬 옵션을 빼고 sort -r만 써서 99보다 1000이 뒤로 가는 결과를 만드는 실수가 자주 나옵니다. 빈도 집계는 -n을 함께 써야 합니다.
  • 로그 앞뒤 공백이나 탭을 정리하지 않고 집계해서 같은 값이 다른 값으로 분리되는 경우가 있습니다. 필요하면 sed 's/^ *//;s/ *$//'로 전처리하세요.

검증 방법

# 집계 대상 라인 수 확인
wc -l /var/log/nginx/access.log

# 상위 집계 합계가 전체 라인보다 큰지 같은지 기본 점검
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | awk '{sum += $1} END {print sum}'

# 결과 파일 저장 시 중복이 실제로 제거됐는지 확인
sort /tmp/raw-users.txt | uniq > /tmp/unique-users.txt
wc -l /tmp/raw-users.txt /tmp/unique-users.txt

운영 팁

빈도 분석 결과를 바로 차단 정책이나 알람 임계치에 연결하면 대응 속도가 빨라집니다.
예를 들어 상위 IP가 특정 시간대에 급증하면 fail2ban 룰이나 WAF 규칙을 임시 강화하고, 다음 날 로그를 다시 비교해 효과를 확인하는 식으로 운영하세요.
팀에서는 집계 명령을 스크립트로 고정해 두면 담당자가 바뀌어도 같은 기준으로 판단할 수 있습니다.

출처

  • GNU Coreutils Manual
  • Ubuntu Manpages
  • The Linux Command Line