apacheのアクセスログを分単位・秒単位に件数を集計

## apacheのアクセスログを分単位・秒単位に件数を集計

ぱっと、アクセスログの集計をしたい際に出すコマンド

- まずアクセスログを確認

```
$ cat /var/log/httpd/access_log | tail
==========
...
192.168.XX.XX - - [02/Sep/2020:23:34:59 +0900] "GET /index.html HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
192.168.XX.XX - - [02/Sep/2020:23:34:59 +0900] "GET /index.html HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
192.168.XX.XX - - [02/Sep/2020:23:34:59 +0900] "GET /index.html HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
192.168.XX.XX - - [02/Sep/2020:23:35:00 +0900] "GET /index.html HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
192.168.XX.XX - - [02/Sep/2020:23:35:00 +0900] "GET /index.html HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
192.168.XX.XX - - [02/Sep/2020:23:35:00 +0900] "GET /index.html HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
192.168.XX.XX - - [02/Sep/2020:23:35:00 +0900] "GET /index.html HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
192.168.XX.XX - - [02/Sep/2020:23:35:00 +0900] "GET /index.html HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
192.168.XX.XX - - [02/Sep/2020:23:35:00 +0900] "GET /index.html HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
192.168.XX.XX - - [02/Sep/2020:23:35:00 +0900] "GET /index.html HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
...
==========
```

## 分間のアクセスログを集計

- コマンド

```
cat /var/log/httpd/access_log | cut -f4 -d' ' | cut -f3 -d'/' | cut -f2,3 -d':' | grep '23:' | uniq -c
==========
      5 23:31
    122 23:32
      1 23:33
    162 23:34
      8 23:35
     39 23:45
      1 23:46
     ↑    ↑
    件数  時間
==========
```

- `cut -f4 -d' '`

```
$ cat /var/log/httpd/access_log | cut -f4 -d' '
[02/Sep/2020:23:35:00
[02/Sep/2020:23:35:41
[02/Sep/2020:23:45:40
[02/Sep/2020:23:45:41
[02/Sep/2020:23:45:41
[02/Sep/2020:23:45:41
[02/Sep/2020:23:45:41

cut -f4 -d' '
    -f : 切り出す位置を(デフォルト)タグ区切りのフィールドで指定
    -d : 区切り文字

区切り文字をスペース( )を指定 → -d' '
切り出す位置は④番目 → -f4
==========
①192.168.XX.XX ②- ③- ④[02/Sep/2020:23:35:00 +0900] ⑤"GET ⑥/index.html.....
==========
```

- `cut -f3 -d'/'`

```
$ cat /var/log/httpd/access_log | cut -f4 -d' ' | cut -f3 -d'/'
2020:23:35:00
2020:23:35:41
2020:23:45:40
2020:23:45:41
2020:23:45:41
2020:23:45:41
2020:23:45:41

cut -f3 -d'/'
    -f : 切り出す位置を(デフォルト)タグ区切りのフィールドで指定
    -d : 区切り文字

区切り文字を/を指定 → -d'/'
切り出す位置は③番目 → -f3
==========
①[02/②Sep/③2020:23:35:00 +0900]
==========
```

- `cut -f2,3 -d':'`

```
$ cat /var/log/httpd/access_log | cut -f4 -d' ' | cut -f3 -d'/' | cut -f2,3 -d':'
23:35
23:45
23:45
23:45
23:45
23:45
23:45
23:45

cut -f2,3 -d':'
    -f : 切り出す位置を(デフォルト)タグ区切りのフィールドで指定
    -d : 区切り文字

区切り文字を:を指定 → -d':'
切り出す位置は②番目(時)と③番目(分) → -f2,3
==========
①2020:②23:③35:④00 +0900]
==========
```

- `grep '23:'`

```
$ cat /var/log/httpd/access_log | cut -f4 -d' ' | cut -f3 -d'/' | cut -f2,3 -d':' | grep '23:'
23:35
23:45
23:45
23:45
23:45
23:45
23:45
23:45

grep '23:'
    特定の文字列が含まれている行を表示する

もし、アクセスログに24:05などが含んでいた場合に23時台のみ、抽出するため。
```

- `uniq -c`

```
$ cat /var/log/httpd/access_log | cut -f4 -d' ' | cut -f3 -d'/' | cut -f2,3 -d':' | grep '23:' | uniq -c
      5 23:31
    122 23:32
      1 23:33
    162 23:34
      8 23:35
     39 23:45
      1 23:46

uniq -c
    重複している行を取り除くコマンド
    -c : 各行数の前に出現回数を出力

出現回数を出力することで、アクセスログの件数を表示することができる
```


## 秒間のアクセスログを集計

- コマンド

```
cat /var/log/httpd/access_log | cut -f4 -d' ' | cut -f3 -d'/' | cut -f2,3,4 -d':' | grep '23:' | uniq -c
==========
      6 23:34:54
      6 23:34:55
      5 23:34:56
      7 23:34:57
      6 23:34:58
      7 23:34:59
      7 23:35:00
      1 23:35:41
      1 23:45:40
      5 23:45:41
      5 23:45:42
      6 23:45:43
      5 23:45:44
      6 23:45:45
      7 23:45:46
      4 23:45:47
      1 23:46:32
      ↑     ↑
    件数   時間
==========
```

- `cut -f4 -d' '`

```
$ cat /var/log/httpd/access_log | cut -f4 -d' '
[02/Sep/2020:23:35:00
[02/Sep/2020:23:35:41
[02/Sep/2020:23:45:40
[02/Sep/2020:23:45:41
[02/Sep/2020:23:45:41
[02/Sep/2020:23:45:41
[02/Sep/2020:23:45:41

cut -f4 -d' '
    -f : 切り出す位置を(デフォルト)タグ区切りのフィールドで指定
    -d : 区切り文字

区切り文字をスペース( )を指定 → -d' '
切り出す位置は④番目 → -f4
==========
①192.168.XX.XX ②- ③- ④[02/Sep/2020:23:35:00 +0900] ⑤"GET ⑥/index.html.....
==========
```

- `cut -f3 -d'/'`

```
$ cat /var/log/httpd/access_log | cut -f4 -d' ' | cut -f3 -d'/'
2020:23:35:00
2020:23:35:41
2020:23:45:40
2020:23:45:41
2020:23:45:41
2020:23:45:41
2020:23:45:41

cut -f3 -d'/'
    -f : 切り出す位置を(デフォルト)タグ区切りのフィールドで指定
    -d : 区切り文字

区切り文字を/を指定 → -d'/'
切り出す位置は③番目 → -f3
==========
①[02/②Sep/③2020:23:35:00 +0900]
==========
```

- `cut -f2,3,4 -d':'`

```
$ cat /var/log/httpd/access_log | cut -f4 -d' ' | cut -f3 -d'/' | cut -f2,3,4 -d':'
23:35:41
23:45:40
23:45:41
23:45:41
23:45:41
23:45:41
23:45:41
23:45:42
23:45:42

cut -f2,3,4 -d':'
    -f : 切り出す位置を(デフォルト)タグ区切りのフィールドで指定
    -d : 区切り文字

区切り文字を:を指定 → -d':'
切り出す位置は②番目(時)と③番目(分)と④番目(秒) → -f2,3,4
==========
①2020:②23:③35:④00
==========
```

- `grep '23:'`

```
$ cat /var/log/httpd/access_log | cut -f4 -d' ' | cut -f3 -d'/' | cut -f2,3,4 -d':' | grep '23:'
23:35:41
23:45:40
23:45:41
23:45:41
23:45:41
23:45:41
23:45:41
23:45:42
23:45:42

grep '23:'
    特定の文字列が含まれている行を表示する

もし、アクセスログに24:05などが含んでいた場合に23時台のみ、抽出するため。
```

- `uniq -c`

```
$ cat /var/log/httpd/access_log | cut -f4 -d' ' | cut -f3 -d'/' | cut -f2,3,4 -d':' | grep '23:' | uniq -c
      7 23:35:00
      1 23:35:41
      1 23:45:40
      5 23:45:41
      5 23:45:42
      6 23:45:43
      5 23:45:44
      6 23:45:45


uniq -c
    重複している行を取り除くコマンド
    -c : 各行数の前に出現回数を出力

出現回数を出力することで、アクセスログの件数を秒ごとに表示することができる
```