awkで色々な処理を行う。2017awkで色々な処理を行う。UNIX/Linuxでシェルスクリプトじゃ出来ないけども、ちょっと複雑なことをしたい。Javaとかで作りこむほどではない。そんなときにawkを使うと便利だ。こんな感じのアクセスログがあって、平均の応答時間を求めたい場合時など。末尾の数字を応答時間(秒)とする。3awkを使えば一行で処理ができる。<入力ログファイル名>簡単に解説すると、以下のようなことをしている。入力ファイルを1行ずつ読み込んで処理をする。読み込んだパラメータは、区切り文字(デフォルトでは半角スペース)に従い自動的に分割し、変数に格納される。は行全体、$1以降はそれぞれ数字の分の要素になる。は行全体の要素数が自動的に入る。したがって、$NFは自動的に末尾の数字になる。ここでは、1行ごとに読み込んで変数「i」に加算している。全ての行を読み込んだ後に処理される。処理を行った行数が自動的に入る。ENDまで来ると、自動的にファイルの行数になる。これで応答時間の合計を除算すると平均の時間になる。これを実行すると、こんな感じの結果になる。~]#4行程度ではわざわざこんなことする方が面倒なのだけども、実際のアクセスログだと何万行を軽く超えるような環境もあるので、そんな場合ではいちいちローカルPCにダウンロードしてきてExcelとか使って解析するよりも、サーバー上でパパッと処理してしまった方が早い。サーバーリソースには要注意だけども......また、awkは正規表現を使って特定行のみを処理するということも出来るので、特定IPからの平均応答時間のみを集計することなども可能。<ログファイル名>先ほどのawk文と比べると、変数が一個増えて、BIGIN{}の後に正規表現が追加されている。すると、マッチングする行のみを対象として処理を行う用になる。~]#先ほどと同じログに対して実行しても、違う結果が返ってきた。このように、特定の条件にマッチングするリクエストのみに対して処理が出来たりもする。IP以外にもHTTPレスポンスコードから抽出したり、一定以上の応答時間のアクセスを抽出したりもできる。~]#余分なデータを除外したり、特定のデータを抽出することを繰り返して解析の精度を上げたりしていける。コマンドラインから実行できるので、シェルに組み込むことも簡単だ。一度実行した処理をまとめてシェルにしておけば、次回以降同じ作業を簡単に実施できる。定例的な処理とか、何か問題が起きた時に使うモノを纏めておくと便利でかっこいいんじゃないかな。編集トップへ戻る閉じる。