サイトを監視していて、「特定の短時間だけ急に重くなった」みたいなケースは、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 してその場で叩けるのでストックしておくとかなり便利です。