awkコマンドについて
記事を書いた背景・概要
仕事でログ解析をすることが多くなりました。今まではエクセルを使って集計をやっていました。
ただ、データ量が多い場合、エクセルの動作が遅くなってきました。なにかいい方法はないかと調べたところawkコマンドに出会いました。
この記事では覚えたawkコマンドの動きや使ったことを簡単にまとめました。
備忘録的な使い方もしていますが、ご容赦ください。
awkコマンドの基本
//:TODO
実例
対象ログ
access_logの中にはこんな形
192.0.2.0 - - [11/Dec/2019:12:01:22 +0000] "GET / HTTP/1.0" 200 35 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3602.2 Safari/537.36"
198.51.100.0 - - [11/Dec/2019:12:02:22 +0000] "POST / HTTP/1.0" 200 35 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3602.2 Safari/537.36"
203.0.113.0 - - [11/Dec/2019:12:01:22 +0000] "GET / HTTP/1.0" 200 35 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3602.2 Safari/537.36"
198.51.100.0 - - [11/Dec/2019:12:02:22 +0000] "GET / HTTP/1.0" 200 35 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3602.2 Safari/537.36"
IP部分の抽出・計算
IP部分の抽出をしたい場合
何も指定しない場合、区切り文字は「 」(半角スペース)です。また、出力したい要素を$と要素番号で指定する。
$1で一番はじめの要素である、IP部分を出力する。
$ cat access_log | awk '{print $1}'
192.0.2.0
198.51.100.0
203.0.113.0
198.51.100.0
何回同じIPからアクセスが来ているかカウントしたい場合
連想配列ipMapにipをキーとして出現回数をvalueとして保持する。End部で、ipMapからipと出現回数を出力する。
「uniq -c」と「sort」コマンドでもできますが、awkコマンドだけでやってみました。
$ cat access_log | awk '{ipMap[$1]++}END{for(i in ipMap){print i,ipMap[i]}}' | sort
192.0.2.0 1
198.51.100.0 2
203.0.113.0 1
時刻部分を抽出・計算
時刻の部分は[]の間に書かれており、また、+以下のタイムゾーンはいらないので、以下を区切り文字として使います。
- [
- ]
- (半角スペース)
[]は正規表現のパターンとして認識されてしまうため、バックスラッシュを前につけます。awkのリファレンスを読むとバックスラッシュ2つでバックスラッシュの意味になるので、2つつけています。(ここがわからず苦戦しました。)
$ cat access_log | awk -F'\\[|\\]| ' '{print $5}'
11/Dec/2019:12:01:22
11/Dec/2019:12:02:22
11/Dec/2019:12:01:22
11/Dec/2019:12:02:22
参考