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]改行とタブで要素の値を展開し、2番目のフィールドを展開します。

  • 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

関連情報