Diverse Advent Calendar 2018の10日目です。
昨日は @SAMUKEI さんのLookerについてのお話でした。
私も触ってみましたが、ブラウザをぽちぽちするだけでキレイなグラフがでてくるのは感動モノです!
本日は私のシェルTipsです。週頭のお口直しにつまんでみてください。
時間無いから一言で言って
「Apacheログ形式」でアクセスログを要求されたけれど、弊環境でのログは「W3Cログ形式」だったので頑張って変換した。
どうしてこうなった
「直近1ヶ月分のアクセスログを分析したいのでくださーい(ApacheログのCombine形式で)。」
と言われ手元に持ってきたログはCloudFrontのログ形式でした。
ちなみにApacheログ形式はこんな。
%h %l %u %t ¥"%r¥" %>s %b ¥"%{Referer}i¥" ¥"%{User-Agent}i¥"
リモートホスト名 クライアントの識別子 認証ユーザー名 日時([DD/M/yyyy hh:mm:ss + 9:00]) "リクエストの最初の行の値" 最後のレスポンスのステータス 送信されたバイト数 "Refererの値" "User-Agentの値"
で、CloudFrontのログ形式はこんなです。基本はW3C拡張ログ形式ですね。
date time x-edge-location sc-bytes c-ip cs-method cs(Host) cs-uri-stem sc-status cs(Referer) cs(User-Agent) cs-uri-query cs(Cookie) x-edge-result-type x-edge-request-id x-host-header cs-protocol cs-bytes time-taken x-forwarded-for ssl-protocol ssl-cipher x-edge-response-result-type cs-protocol-version fle-status fle-encrypted-fields
日付(yyyy-mm-dd) 時刻 エッジロケーション バイト数 クライアントIPアドレス アクセス方式 CFディストリビューションのドメイン名 パスURI ステータスコード リファラー User-Agent クエリ文字列 クッキーヘッダー CFのレスポンス分類 識別文字列 リクエストドメイン名 プロトコル ヘッダを含むバイト数 サーバー時間 IPアドレス SSLバージョン 暗号方式 CF分類 フィールド数
順番バラバラですし、なにより日付形式が形式が大きく違っております。
今回一回だけのことなので、手元で変換するべくBash+awkでこねくりまわしました。
結局のところ何したの
- とりあえずダウンロードしてきたファイル群をまとめて解凍
- 解凍したファイルを一件ずつ処理開始
- 日毎に1ファイルになるように、ログ日をファイル名として変数格納
- ファイルをオープン→文字列を変換→ファイルに追記
- 最後にまとめて圧縮して完了
今回のカレンダーでネタにしよう!
と思ってローカル内を漁ったものの、すべてが dev/null に吸い込まれて揮発していました。😱
残っていたのは↓の変換するワンライナー部分だけでした。
cat $元ファイル名 | awk '
{
split($1,ar,"-");
mon=ar[2];
m=(mon==10)?"Oct":"Sep";
datestr=ar[3]"/"m"/"ar[1];
gsub(/%2520/," ",$11);
print $7,"- - ["datestr":"$2"]",$6,$8,$9,$4,$10,$11
}
' >> $出力ファイル名
注意点:日付が9月10月にしか対応していません!
まとめ
普段シェルを触らないと、こういうときにまごついちゃうよねー。という知見を得ました。
誰かのお役に立てれば幸いです(なさそう)。
明日は @aono099 さんの 「みんなでやる競合調査」です! 楽しみですね!