bucket-sort logo bucket-sort

プログラミングとインフラエンジニアリングの覚え書き

  • Posts
  • About
  • Contact
  1. Home
  2. All Posts
  3. 指定時間内にサイトへのアクセスが多いIPアドレスランキングを取得するシェルワンライナー

指定時間内にサイトへのアクセスが多いIPアドレスランキングを取得するシェルワンライナー

Jan 28, 2026 Linux bucket-sort

サイトを監視していて、「特定の短時間だけ急に重くなった」みたいなケースは、HTML レポートを見るよりログを直接ナメた方が早い場面も多いです。

その場でパッと

この 20 分間で誰が一番アクセスしてきてるの?

を知りたいとき用の、ログを一発で絞り込んで IP ランキングを出すワンライナーを整理しておきます。

Apacheアクセスログの基本フォーマット

Apache の access log(common / combined)は、ざっくりこんな構造になっています。

192.168.1.10 - - [14/Jan/2026:12:34:56 +0900] "GET /index.html HTTP/1.1" 200 1234

フィールドとしては:

項目 内容
$1 アクセス元 IP
$4 アクセス日時([14/Jan/2026:12:34:56)
$5 タイムゾーン(+0900])

今回使うのはこのうち

  • $1 → IPアドレス
  • $4 → 時刻

です。

時間帯指定+IPランキングを一発で出す

例えば、

2026年1月14日 12:20:00〜12:40:59 の間にアクセスが多かったIPランキング

を出したい場合は、以下のワンライナーで取得できます。

awk '$4 >= "[14/Jan/2026:12:20:00" && $4 <= "[14/Jan/2026:12:40:59" {c[$1]++}
     END {for (ip in c) printf "%8d %s\n", c[ip], ip}' access.log | sort -nr

何をやっているのか

① 時刻でログをフィルタ

Apache の $4 は

[14/Jan/2026:12:34:56

という形式の 文字列 ですが、

DD/Mon/YYYY:HH:MM:SS

の並び順は辞書順=時系列順になるため、 同一日付内であれば 文字列比較で時間範囲を判定可能 です。

$4 >= "[14/Jan/2026:12:20:00" && $4 <= "[14/Jan/2026:12:40:59"

② IPごとのアクセス数をカウント

c[$1]++

awk の連想配列を使って

キー   = IPアドレス
値     = アクセス数

という形でインクリメントしています。

これにより、

awk '{print $1}' | sort | uniq -c

のような中間処理ファイルを作らずに済みます。

③ 集計結果を出力

END {
  for (ip in c)
    printf "%8d %s\n", c[ip], ip
}

で

    123 203.0.113.10
     98 198.51.100.22

のような形式に整形しています。

最後に

sort -nr

でアクセス数の多い順に並び替えます。

上位N件だけ見たい場合

bot やクローラ調査だと「上位数件」だけ見られれば十分なので、

awk '$4 >= "[14/Jan/2026:12:20:00" && $4 <= "[14/Jan/2026:12:40:59" {c[$1]++}
     END {for (ip in c) printf "%8d %s\n", c[ip], ip}' access.log \
| sort -nr \
| head -20

のように head を付けると便利です。

典型的な使いどころ

  • ALB配下の EC2 が急に高負荷になった時間帯の調査
  • 特定時間の bot / crawler の挙動確認
  • WAF ルール作成前のアクセス元分析
  • 5xx エラーが集中した時間帯のトラフィック確認

GoAccess の日次レポートでは粗すぎる「数分〜数十分」のスパイクを追うときに、SSH してその場で叩けるのでストックしておくとかなり便利です。

Linux Apache 監視
← RDSのステータスがoptimizing / storage-optimizationのまま長時間続くのは何をしているのか? Lambdaの費用・無料枠をざっくり調査 →

Related Posts

  • サーバーがリブートされたか確認する方法 Jan 3, 2026
  • iptablesとipsetによるLinuxサーバーの基本的なファイアウォール設定 Feb 21, 2026
  • Amazon Linux 2023のOS更新まわりの挙動を整理しておく Feb 20, 2026
  • サービスを実行するユーザにログインを許可した場合のセキュリティリスクを考える Feb 18, 2026

Table of Contents

  • Apacheアクセスログの基本フォーマット
  • 時間帯指定+IPランキングを一発で出す
  • 何をやっているのか
    • ① 時刻でログをフィルタ
    • ② IPごとのアクセス数をカウント
    • ③ 集計結果を出力
  • 上位N件だけ見たい場合
  • 典型的な使いどころ

Recent Posts

  • Laravel の Event / Listener で Pub/Sub を実装する Apr 2, 2026
  • [C#] delegate と event の仕組みを整理する Apr 1, 2026
  • Pub/Sub パターンとは何か Mar 31, 2026
  • PHP/Laravel で値の状態を判定するヘルパ関数まとめ Mar 30, 2026
  • Filament の dehydrated メソッドとは何か Mar 29, 2026

Categories

  • AWS27
  • C#22
  • .NET20
  • Laravel16
  • Linux12
  • Apache8
  • MySQL8
  • PHP8
  • DynamoDB6
  • Nginx5
  • WordPress4
  • インフラ4
  • Hugo3
  • セキュリティ3
  • .NET Framework1
  • Aurora1
  • Filament1
  • Git1
  • SQS1

Tags

  • AWS
  • C#
  • .NET
  • Laravel
  • PHP
  • MySQL
  • セキュリティ
  • Linux
  • Apache
  • Code Snippet
  • DynamoDB
  • NoSQL
  • PHP-FPM
  • RDS
  • DoS
  • Nginx
  • Windows
  • WordPress
  • パフォーマンス
  • 監視
  • Amazon Linux 2023
  • CMS
  • Docker
  • Ipset
  • Iptables
  • OPCache
  • Webサーバー
  • 認可
  • Aurora
  • Blade
Powered by Hugo & Explore Theme.