KEIS BLOGは株式会社ケイズ・ソフトウェアが運営しています。

KEIS BLOG

sort と uniq を使ってログファイルから出現順位ランキング!


サーバー管理やシステム運用しててログファイルの分析したい!っていう状況は良くあるんですが。

大量のログデータから特定の情報を抽出し、出現頻度をランキング形式で表示する、っていうのをよくやります。

問題の特定、パフォーマンスの最適化に使うわけです。

ってことで、Unix系システムでよく使用されるコマンドラインツールである sortuniq を活用して、ログファイルから出現順位ランキングを作成する方法を詳しく解説します。

目次


はじめに

ログファイルはシステムの動作状況やエラー情報を記録する重要なデータソースです。しかし、ログファイルが大きくなると、必要な情報を手動で探し出すのは困難です。そこで、sortuniq コマンドを組み合わせることで、特定のパターンやエントリの出現頻度を効率的に分析できます。

基本的なコマンドの使い方

まずは、sortuniq の基本的な使い方を理解しましょう。

sort コマンド

sort コマンドは、ファイルや標準入力から読み込んだデータを並べ替えるためのツールです。デフォルトでは、アルファベット順にソートされます。

sort [オプション] [ファイル名]

uniq コマンド

uniq コマンドは、隣接する重複行を削除するためのツールです。sort と組み合わせて使用することで、出現頻度のカウントや重複の削除が可能になります。

uniq [オプション] [入力ファイル] [出力ファイル]

実践的な使用例

実際にログファイルを例に取り、sortuniq を使って出現順位ランキングを作成する方法を見ていきましょう。ここでは、ウェブサーバーのアクセスログを例にします。

例:ウェブサーバーのアクセスログからIPアドレスの出現頻度をランキングする

以下のようなアクセスログファイル(access.log)があるとします。

192.168.1.1 - - [10/Apr/2024:13:55:36 +0000] "GET /index.html HTTP/1.1" 200 1024
192.168.1.2 - - [10/Apr/2024:13:56:01 +0000] "POST /login HTTP/1.1" 200 512
192.168.1.1 - - [10/Apr/2024:13:57:12 +0000] "GET /dashboard HTTP/1.1" 200 2048
192.168.1.3 - - [10/Apr/2024:13:58:45 +0000] "GET /index.html HTTP/1.1" 200 1024
192.168.1.2 - - [10/Apr/2024:13:59:30 +0000] "GET /profile HTTP/1.1" 200 1024

このログから、各IPアドレスのアクセス回数をランキング形式で表示するには、以下のコマンドを使用します。

cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr

コマンドの詳細解説

  • cat access.log:アクセスログファイルを表示します。
  • awk '{print $1}':各行の最初のフィールド(IPアドレス)を抽出します。
  • sort:抽出したIPアドレスをソートします。
  • uniq -c:ソートされたIPアドレスの重複を削除し、出現回数をカウントします。
  • sort -nr:カウント結果を数値の降順に再度ソートします。

実行結果

      2 192.168.1.1
      2 192.168.1.2
      1 192.168.1.3

この結果から、192.168.1.1192.168.1.2 がそれぞれ2回ずつアクセスしており、192.168.1.3 が1回アクセスしていることがわかります。

別の例:エラーメッセージの頻度をランキングする

次に、アプリケーションのログファイル(error.log)からエラーメッセージの頻度をランキングする方法を見てみましょう。

2024-04-10 13:55:36 ERROR Database connection failed
2024-04-10 13:56:01 ERROR User authentication failed
2024-04-10 13:57:12 WARNING Disk space low
2024-04-10 13:58:45 ERROR Database connection failed
2024-04-10 13:59:30 INFO User logged in

エラーメッセージの種類ごとの出現頻度をランキングするには、以下のコマンドを使用します。

grep "ERROR" error.log | awk -F"ERROR " '{print $2}' | sort | uniq -c | sort -nr

コマンドの詳細解説

  • grep "ERROR" error.log:ログファイルから「ERROR」を含む行を抽出します。
  • awk -F"ERROR " '{print $2}':「ERROR 」を区切り文字として使用し、エラーメッセージ部分を抽出します。
  • sort:抽出したエラーメッセージをソートします。
  • uniq -c:ソートされたエラーメッセージの重複を削除し、出現回数をカウントします。
  • sort -nr:カウント結果を数値の降順に再度ソートします。

実行結果

      2 Database connection failed
      1 User authentication failed

この結果から、「Database connection failed」が2回、「User authentication failed」が1回発生していることがわかります。

応用テクニック

基本的な使い方に加えて、いくつかの応用的なテクニックを紹介します。

1. 特定のフィールドでソートする

sort コマンドは、特定のフィールドでソートすることも可能です。例えば、ログファイルの2番目のフィールド(タイムスタンプ)でソートする場合:

sort -k2,2 access.log

2. 大文字小文字を無視してソートする

sort コマンドに -f オプションを追加することで、大文字小文字を無視してソートできます。

sort -f access.log | uniq -c | sort -nr

3. 重複を削除せずに出現回数をカウントする

場合によっては、重複を削除せずに全てのエントリをカウントしたいこともあります。その場合は、uniq の代わりに awk を使用します。

sort access.log | awk '{count[$0]++} END {for (line in count) print count[line], line}' | sort -nr

まとめ

ちゃなことで一通りまとめてみました。sortuniq は、ログファイルの分析において非常に強力なツールです。

これらを組み合わせることで、特定のパターンやエントリの出現頻度を効率的に分析し、システムの状態を把握することができます。

この記事で紹介したテクニックを活用して、皆さんのさらなるクオリティオブログファイル分析生活が向上することを祈っております。


参考資料