데이터 계산 및 요약하기
AWK 는 발생 횟수를 세고 데이터를 요약하는 데 매우 뛰어납니다. 이를 사용하여 각 HTTP 상태 코드별 요청 수를 계산해 보겠습니다.
다음 명령어를 실행하세요.
awk '{count[$6]++} END {for (code in count) print code, count[code]}' server_logs.txt | sort -n
이 명령어는 다소 복잡하므로 단계별로 살펴보겠습니다.
-
{count[$6]++} - 각 줄에 대해 수행되는 주요 동작입니다.
count는 우리가 생성하는 배열 (연관 배열 또는 딕셔너리) 입니다.
[$6]은 6 번째 필드 (상태 코드) 의 값을 배열의 인덱스/키로 사용합니다.
++는 증가 연산자로, 현재 값에 1 을 더합니다.
- 즉, 각 줄을 읽을 때마다 발견된 특정 상태 코드에 대한 카운터를 증가시킵니다.
-
END {for (code in count) print code, count[code]} - 모든 줄을 처리한 후 실행됩니다.
END는 입력의 끝에서 실행되는 특수 패턴입니다.
{...}는 모든 입력 처리가 끝난 후 수행할 동작을 포함합니다.
for (code in count)는 count 배열의 모든 키를 순회하는 루프입니다.
print code, count[code]는 각 상태 코드와 해당 카운트를 출력합니다.
-
| sort -n - 출력을 sort 명령어로 전달하여 숫자로 정렬합니다.
AWK 가 count[$6]++와 같은 배열을 처리할 때 다음과 같은 작업이 자동으로 이루어집니다.
- 배열이 없으면 생성합니다.
- 키가 없으면 값이 0 인 새 요소를 생성합니다.
- 그런 다음 값을 1 증가시킵니다.
다음과 유사한 출력이 표시될 것입니다.
200 3562
301 45
302 78
304 112
400 23
403 8
404 89
500 15
이 요약을 통해 로그 파일의 상태 코드 분포를 빠르게 파악할 수 있습니다.
이제 가장 자주 액세스된 상위 5 개 리소스를 찾아보겠습니다.
awk '{count[$5]++} END {for (resource in count) print count[resource], resource}' server_logs.txt | sort -rn | head -n 5
이 명령어는 몇 가지 변경 사항을 제외하고는 유사한 패턴을 따릅니다.
{count[$5]++} - 5 번째 필드 (요청된 리소스) 의 발생 횟수를 셉니다.
END {for (resource in count) print count[resource], resource} - 모든 줄 처리 후:
- 카운트를 먼저 출력하고 그 뒤에 리소스를 출력합니다.
- 이 순서 변경은 카운트 기준의 숫자 정렬을 용이하게 합니다.
| sort -rn - 역순으로 숫자 정렬을 수행합니다 (가장 높은 카운트가 먼저 옴).
| head -n 5 - 출력을 상위 5 개 결과로 제한합니다.
출력 결과:
1823 /index.html
956 /about.html
743 /products.html
512 /services.html
298 /contact.html
이러한 AWK 명령어는 계산 및 요약을 위해 배열을 사용하는 강력함을 보여줍니다. 이 패턴을 응용하여 데이터의 모든 필드나 필드 조합의 개수를 셀 수 있습니다.
예를 들어, IP 주소당 요청 수를 세려면 다음과 같이 합니다.
awk '{count[$3]++} END {for (ip in count) print ip, count[ip]}' server_logs.txt
메서드와 상태 코드별로 요청 수를 세려면 다음과 같이 합니다.
awk '{key=$4"-"$6; count[key]++} END {for (k in count) print k, count[k]}' server_logs.txt
이러한 요약 정보는 트래픽 패턴을 이해하고 서버에서 인기 있는 (또는 문제가 있는) 리소스를 식별하는 데 도움이 됩니다.