sed 또는 awk를 사용하여 URL별로 Apache 로그 행을 그룹화하시겠습니까?

sed 또는 awk를 사용하여 URL별로 Apache 로그 행을 그룹화하시겠습니까?

/var/log/apache2/other_vhosts_access.log다음과 같은 파일이 주어지면:

example.com:443 1.1.1.1 - - [25/Jan/2021:12:00:00 +0000] "GET /abc/def/ghi?token=jklm12 HTTP/1.1" 200 1000 "-" "Mozilla/5.0 (Macintosh; Intel...
example.com:443 2.2.2.2 - - [25/Jan/2021:12:00:00 +0000] "GET /abc/def/ghi?token=jklm13 HTTP/1.1" 200 1000 "-" "Mozilla/5.0 (Macintosh; Intel...
example.com:443 33.33.33.33 - - [25/Jan/2021:12:00:00 +0000] "GET /abc/def/ghi?token=jklm14 HTTP/1.1" 200 1000 "-" "Mozilla/5.0 (Macintosh; Intel...
example.com:443 4.4.4.4 - - [25/Jan/2021:12:00:00 +0000] "GET /abc/def/ghi?token=jklm12 HTTP/1.1" 200 1000 "-" "Mozilla/5.0 (Macintosh; Intel...

URL을 "기준"으로 그룹화한 IP를 집계하는 방법은 무엇입니까?

예:

 /abc/def/ghi?token=jklm12
     1.1.1.1
     4.4.4.4
 /abc/def/ghi?token=jklm13
     2.2.2.2
 /abc/def/ghi?token=jklm14
     33.33.33.33

특정 열을 추출 하는 데 사용할 수 있다는 것을 알고 있지만 awk"그룹화"를 수행하는 방법은 무엇입니까?

답변1

awk '{a[$8]=a[$8] "\n\t" $2} END{for (url in a) print url, a[url]}' file

배열은 a처음에는 비어 있습니다.

  • {a[$8]=a[$8] "\n\t" $2}a[$8]줄 바꿈과 탭으로 요소의 값을 확장한 다음 두 번째 필드를 확장합니다.

  • END이 블록은 전체 파일을 구문 분석한 후에만 실행됩니다. 배열의 각 키에 대해 키( url) 및 관련 값( )이 인쇄됩니다.a[url]

산출:

/abc/def/ghi?token=jklm14
        33.33.33.33
/abc/def/ghi?token=jklm12
        1.1.1.1
        4.4.4.4
/abc/def/ghi?token=jklm13
        2.2.2.2

관련 정보