• このエントリーをはてなブックマークに追加

【awk】ログの件数を1分毎に集計するシェルスクリプト

  • このエントリーをはてなブックマークに追加

awk2
zaco muraです。

サーバエンジニアがよく行う作業の一つがログ解析です。今回、ログを加工して1分毎の件数を集計する機会があったのでメモしておきます。

スポンサーリンク
Sponsords Link

やりたいこと

ログの中で”Connect”と表示される行数が1分間に何回出ているかを集計し、表示したい。

ちなみにログはこんな感じ

[root@server ~]# cat connect.log
Jan 21 04:02:10 Connect user1@test.com
Jan 21 04:02:21 Disconnect user1@test.com
Jan 21 04:02:30 Connect user2@test.com
・・・・

環境など

・centos7.2.1511
・bash
・awk

実現方法

いろいろな実現方法があるかと思いますが、awkを使えばわりと簡単に作れます。
awkを使うメリットはファイルを1回しか走査しないので、(比較的)高速に動作するということです。
ソースコードはこんな感じです。

#!/bin/sh
#
#
################################
# log_count.sh 
# --------------------
# 1分毎にログを集計するツール
# (基本的に全部awkで実行)
################################

# 引数としてファイル名を渡す。無いと動作しないので、exitする。
if [ "$#" != 1 ];then
   echo "ファイルを指定してください"
   exit 1
fi

# "Connect"の部分に集計したいキーワードを記述。//で囲むことで正規表現にしてます
awk '$0~/Connect/{

        # ファイルの中で最初の1行のみ実行。基準となる時間を取得
        if(NR==1){

                # $1 は 月
                month=$1

                # $2 は 日
                day=$2

                # $3 は 時間(HH:MM:SS) 分単位で計算したいので、0文字目~5文字目だけ表示。(=秒は表示しない)
                time=substr($3,0,5)

                # 件数に+1する。
                num=1
        }

        # 読み込んだ行と現在の基準時間を比較する
        if(month==$1 && day==$2 && time==substr($3,0,5)){

                # 月日時間が全て一致した場合は、現在の基準時間と同じであるため、
                # 同一時間でのログであると判断。件数に+1する
                num++
        }else{

                ### 一致しない場合は次の時間の行を読み込んだと判断。
                # 現在の基準時間の合計数を表示
                print(month" "day" "time" = "num)

                # 基準時間を新しく設定し直す
                month=$1
                day=$2
                time=substr($3,0,5)
                num=1
        }
}END{
        # 最後の基準時間の合計数を表示して終了
        print(month" "day" "time" = "num)
}' $1

実際に実行するとこんな感じになります。

[root@server ~]# sh log_count.sh connect.log
Jan 21 04:02 = 4
Jan 21 04:03 = 12
Jan 21 04:04 = 8
Jan 21 04:05 = 16

注意点や補足など

・ファイルが存在するかなどは見てません。商用ツールなどではきちんとエラーチェックしましょう
・ものすごく大きなファイルでは、キーワードは正規表現ではなく完全一致のほうが高速だと思います
・ログが無かった時間は表示されないため、例えば”Jan 21 04:05″の次が”Jan 21 04:10″になることもあります
・そもそもシェルスクリプトじゃなくてawkスクリプトで書けば良いというツッコミは無しで
(シェルスクリプトにしたほうが楽なんです。。)

まとめ

こういうのがパッと作れるとかっこいいですよね。パッと作れるように頑張りたいと思いました。

スポンサーリンク
Sponsords Link
  • このエントリーをはてなブックマークに追加

ZacoDesign

スポンサーリンク
Sponsords Link