ログ調査でよく使うコマンドの基礎知識


ログの調査はサーバーを運用する上で欠かせません。
この記事ではログの調査によく使うコマンドの使い方を記載しています。

## 基礎編

次のようなログファイルを例に各コマンドを説明していきます。
order.log(左から注文番号、注文者名、注文方法、注文サイズ、注文数)

```text
注文1 ミロゴス太郎 店舗注文 Lサイズ 15
注文2 ミロゴス二郎 宅配注文 Mサイズ 25
注文3 ミロゴス三郎 宅配注文 Sサイズ 46
注文4 ミロゴス太郎 店舗注文 XLサイズ 80
注文5 ミロゴス太郎 宅配注文 Sサイズ 39
注文6 ミロゴス三郎 店舗注文 Mサイズ 53
注文7 ミロゴス二郎 店舗注文 Mサイズ 22
注文8 ミロゴス四郎 宅配注文 LLサイズ 68
注文9 ミロゴス五郎 店舗注文 Sサイズ 42
注文10 ミロゴス太郎 宅配注文 Sサイズ 39
```

### catコマンド

- 役割
  - ファイルの中身を表示する。
- 主な用途
  - ファイルの中身を見たいときに使う。
- 実行例

```bash
❯ cat order.log # ファイルの中身を表示
注文1 ミロゴス太郎 店舗注文 Lサイズ 15
注文2 ミロゴス二郎 宅配注文 Mサイズ 25
注文3 ミロゴス三郎 宅配注文 Sサイズ 46
注文4 ミロゴス太郎 店舗注文 XLサイズ 80
注文5 ミロゴス太郎 宅配注文 Sサイズ 39
注文6 ミロゴス三郎 店舗注文 Mサイズ 53
注文7 ミロゴス二郎 店舗注文 Mサイズ 22
注文8 ミロゴス四郎 宅配注文 LLサイズ 68
注文9 ミロゴス五郎 店舗注文 Sサイズ 42
注文10 ミロゴス太郎 宅配注文 Sサイズ 39

❯ cat -n order.log # 行番号も表示
     1	注文1 ミロゴス太郎 店舗注文 Lサイズ 15
     2	注文2 ミロゴス二郎 宅配注文 Mサイズ 25
     3	注文3 ミロゴス三郎 宅配注文 Sサイズ 46
     4	注文4 ミロゴス太郎 店舗注文 XLサイズ 80
     5	注文5 ミロゴス太郎 宅配注文 Sサイズ 39
     6	注文6 ミロゴス三郎 店舗注文 Mサイズ 53
     7	注文7 ミロゴス二郎 店舗注文 Mサイズ 22
     8	注文8 ミロゴス四郎 宅配注文 LLサイズ 68
     9	注文9 ミロゴス五郎 店舗注文 Sサイズ 42
    10	注文10 ミロゴス太郎 宅配注文 Sサイズ 39
```

- 主なオプション

| オプション | 意味 |
| --- | --- |
| -n | 行番号を付け加える |
| -b | 行番号を付け加える。ただし空白行には付けない |
| -s | 連続した空行を1行にする |
| -v | TAB 改行 改ページ以外の非表示文字を表示する |

### grepコマンド

- 役割
  - ファイルの中の文字列を検索する。
- 主な用途
  - 特定の単語を含むログを検索したいときに使う。
- 実行例

```bash
❯ grep "店舗注文" order.log # 店舗注文のみを表示
注文1 ミロゴス太郎 店舗注文 Lサイズ 15
注文4 ミロゴス太郎 店舗注文 XLサイズ 80
注文6 ミロゴス三郎 店舗注文 Mサイズ 53
注文7 ミロゴス二郎 店舗注文 Mサイズ 22
注文9 ミロゴス五郎 店舗注文 Sサイズ 42

❯ grep -c "店舗注文" order.log # 店舗注文の数を表示
5
```

- 主なオプション

| オプション | 意味 |
| --- | --- |
| -v | パターンに一致しない行を表示する |
| -s | エラーメッセージを表示しない |
| -c | 一致するものが含まれている回数のみ表示 |
| -o | 一致した箇所だけを表示する（通常は行単位で表示） |
| -n | 行番号を併せて表示する |
| -b | パターンが何文字目にあるかを併せて表示する |

### wcコマンド

- 役割
  - 文字数や行数を数えることができる。
- 主な用途
  - 行数を数えるときなどに使う。
- 実行例

```bash
❯ wc order.log # 行数 単語数 バイト数を表示
      10      20     644 order.log

❯ wc -l order.log # 行数を表示
      10 order.log
```

- 主なオプション

| オプション | 意味 |
| --- | --- |
| -c | バイト数を表示する |
| -m | 文字数を表示する（マルチバイト文字に対応） |
| -l | 改行の数を表示する |
| -w | 単語数を表示する |

### awkコマンド

- 役割
  - 特定の文字列などを抽出できる。
- 主な用途
  - 注文サイズなど ログに含まれる個別の内容を検索するときに使う。
- 実行例

```bash
❯ awk '{print $2}' order.log # スペース区切りで左から三番目の文字列を抽出
ミロゴス太郎
ミロゴス二郎
ミロゴス三郎
ミロゴス太郎
ミロゴス太郎
ミロゴス三郎
ミロゴス二郎
ミロゴス四郎
ミロゴス五郎
ミロゴス太郎

❯ awk '{print $5}' order.log # 同様に枚数のみを表示
15
25
46
80
39
53
22
68
42
39
```

- 主なオプション

| オプション | 意味 |
| --- | --- |
| -f ファイル名 | awkスクリプトが書かれたファイルを指定する |
| -F 区切り文字 | 区切り文字を指定する（デフォルトは空白文字） |
| -v 変数名=値 | 変数を定義する |

### sortコマンド

- 役割
  - テキストファイルを行単位で並べ替える。
- 主な用途
  - 時系列順や名前順にしたいときに使う。
- 実行例

```bash
❯ sort order.log # 名前順にソート
注文1 ミロゴス太郎 店舗注文 Lサイズ 15
注文10 ミロゴス太郎 宅配注文 Sサイズ 39
注文2 ミロゴス二郎 宅配注文 Mサイズ 25
注文3 ミロゴス三郎 宅配注文 Sサイズ 46
注文4 ミロゴス太郎 店舗注文 XLサイズ 80
注文5 ミロゴス太郎 宅配注文 Sサイズ 39
注文6 ミロゴス三郎 店舗注文 Mサイズ 53
注文7 ミロゴス二郎 店舗注文 Mサイズ 22
注文8 ミロゴス四郎 宅配注文 LLサイズ 68
注文9 ミロゴス五郎 店舗注文 Sサイズ 42

❯ sort -r order.log # 逆順で表示
注文9 ミロゴス五郎 店舗注文 Sサイズ 42
注文8 ミロゴス四郎 宅配注文 LLサイズ 68
注文7 ミロゴス二郎 店舗注文 Mサイズ 22
注文6 ミロゴス三郎 店舗注文 Mサイズ 53
注文5 ミロゴス太郎 宅配注文 Sサイズ 39
注文4 ミロゴス太郎 店舗注文 XLサイズ 80
注文3 ミロゴス三郎 宅配注文 Sサイズ 46
注文2 ミロゴス二郎 宅配注文 Mサイズ 25
注文10 ミロゴス太郎 宅配注文 Sサイズ 39
注文1 ミロゴス太郎 店舗注文 Lサイズ 15
```

- 主なオプション

| オプション | 意味 |
| --- | --- |
| -r | 逆順で並べ替える |
| -f | 大文字／小文字を区別しないで並べ替える |
| -V | 自然な（バージョン）数字順で並べ替える |
| -n | 文字列を数値と見なして並べ替える |
| -g | 一般的な数値として並べ替える |
| -b | 先頭の空白を無視して並べ替える |

### uniqコマンド

- 役割
  - 重複している行を取り除く。
- 主な用途
  - 重複を除いて検索をしたいときに使う。
- 実行例

```bash
❯ uniq -c order.log # 重複回数を表示
   1 注文1 ミロゴス太郎 店舗注文 Lサイズ 15
   1 注文2 ミロゴス二郎 宅配注文 Mサイズ 25
   1 注文3 ミロゴス三郎 宅配注文 Sサイズ 46
   1 注文4 ミロゴス太郎 店舗注文 XLサイズ 80
   1 注文5 ミロゴス太郎 宅配注文 Sサイズ 39
   1 注文6 ミロゴス三郎 店舗注文 Mサイズ 53
   1 注文7 ミロゴス二郎 店舗注文 Mサイズ 22
   1 注文8 ミロゴス四郎 宅配注文 LLサイズ 68
   1 注文9 ミロゴス五郎 店舗注文 Sサイズ 42
   1 注文10 ミロゴス太郎 宅配注文 Sサイズ 39

❯ uniq -d order.log # 重複しているものだけ表示(重複しているものはない)

```

- 主なオプション

| オプション | 意味 |
| --- | --- |
| -c | 各行の前に出現回数を出力する |
| -u | 重複していない行だけを出力する |
| -d | 重複した行だけを出力する |
| -i | 比較時に大文字と小文字の違いを無視する |
| -w N | 行の比較を最初のN文字で行う |
| -s N | 最初のN文字を比較しない |

## 応用編

ここまでのコマンドは全て単体で使用した例を載せましたが、これらのコマンドは組み合わせて使うことができます。
コマンドの間に "|" (パイプ)を挟むことにより、一つ目のコマンドの実行結果を次のコマンドに渡すことが可能です。


### 店舗注文をした人のリストだけ表示する(grep + awk)

- grepコマンドで店舗注文だけを抽出し、そこからawkコマンドで名前だけ抽出しています。

```bash
❯ grep "店舗注文" order.log | awk '{print $2}'
ミロゴス太郎
ミロゴス太郎
ミロゴス三郎
ミロゴス二郎
ミロゴス五郎
```

### 重複なしで注文した人のリストを出す(awk + sort + uniq)

- まず注文した人一覧を抽出し、そこから重複を取り除いています(uniqの前にsortをしないといけないことに注意)。

```bash
❯ awk '{print $2}' order.log | sort | uniq
ミロゴス三郎
ミロゴス二郎
ミロゴス五郎
ミロゴス四郎
ミロゴス太郎
```

### 誰が何回注文をしたのかを数える(awk + sort + uniq + sort)

- 上記のものから重複回数をカウントし、さらに降順に並び替える。

```bash
❯ awk '{print $2}' order.log | sort | uniq -c | sort -r
   4 ミロゴス太郎
   2 ミロゴス二郎
   2 ミロゴス三郎
   1 ミロゴス四郎
   1 ミロゴス五郎
```

- 同様にしてどのサイズが何回注文されているかなど好きな要素で抽出することが可能。

```bash
❯ awk '{print $4}' order.log | sort | uniq -c | sort -r
   4 Sサイズ
   3 Mサイズ
   1 XLサイズ
   1 Lサイズ
   1 LLサイズ
```

### 特定の注文数を数える(grep + awk)

- まずは"ミロゴス太郎"が含まれる行数だけ表示。

```bash
❯ grep "ミロゴス太郎" order.log                                
注文1 ミロゴス太郎 店舗注文 Lサイズ 15
注文4 ミロゴス太郎 店舗注文 XLサイズ 80
注文5 ミロゴス太郎 宅配注文 Sサイズ 39
注文10 ミロゴス太郎 宅配注文 Sサイズ 39
```

- 上記の結果にawkコマンドを加え、"ミロゴス太郎"の注文数の合計を出す。

```bash
❯ grep "ミロゴス太郎" order.log | awk '{s += $5} END {print s}'
173
```

- 同様にして注文サイズ別の注文数を出すことも可能。

```bash
❯ grep "Mサイズ" order.log 
注文2 ミロゴス二郎 宅配注文 Mサイズ 25
注文6 ミロゴス三郎 店舗注文 Mサイズ 53
注文7 ミロゴス二郎 店舗注文 Mサイズ 22

❯ grep "Mサイズ" order.log | awk '{s += $5} END {print s}'
100
```

# おわりに

一種類のコマンドでできることはそんなに多くはないですが、複数のコマンドを組み合わせるととても多くのことができるようになります。
こういったログ調査を定期的に行う場合は、シェルスクリプトなどに処理をまとめてすぐに実行できるようにするのがオススメです。
私がよくログ調査をするので、同じように調査をする方のお役に立てれば幸いです。