仕事でデータの集計をした時にワンライナーを書いたので、その覚書です。
注意:sedとawkを使っていないです。
sedとかawkを使う前に、シェルの計算式を作れる文法を知ってそっちで集計をしましたので、レベルとしては下の下だと思います・・・
次回には、awkやsedの記事もやりたいと思います。
個人的に、凄くone-linerカッコよくて楽しいです。
本編
初めてデータ集計の作業をしたので、ログをデータから引っ張ってくるところからの思考も書いておきます。これを書く理由は、ログを集計するという問題を解決するにあたり、どうやって中身を調べてきたかまでを含めて、ワンライナーを応用することであると考えるからです。
思考の走りだし1
サーバーのログファイルから、お目当ての情報だけを抜き出して、ファイルに変換する。ログファイルには、ユーザーのデータや日付け、などの今回の調べたいもの以外の情報も持っているため、まず、必要な情報だけを引っ張り出す所から始めます。
cat *.log | cut -f タブ番号 > log.log
今回自分が担当した案件では、Apachのログファイルだったので、タブ区切り表記を利用してURL部分だけを抽出しています。
これにより、必要な情報であるダウンロードされた分だけ叩かれたURLを抜き出せます。
思考の走りだし2
ここで大事なのは、集計したいデータがどこに格納されているかを考えること事です。今回はとあるコンテンツのダウンロードされた回数を知りたかったので、何回そのコンテンツのダウンロードボタンのURLにリクエストが飛んだかを調べればよいと考え、そのコンテンツが叩かれたであろうURLだけをコンテンツ毎にファイルかしていく
grep log.log 調べたいURL > コンテンツ名.txt
これをコンテンンツ分やって、コンテンツ毎に切り分けられてそのコンテンツのURLだけになったテキストファイルができあがります。
思考の最後
後はコンテンンツ毎に別れたファイルをカウントしてあげれば完了ですが、1個ずつカウントしていくのは大変なので、シェルスクリプトで処置しました。
#!/bin/bash
for path in `cat コンテンツ名.txt`;
do
echo $path `grep $path log.log | wc -l`;
done;
for path in `cat コンテンツ名.txt`;
do
echo $path `grep $path log.log | wc -l`;
done;
for path in ` cat コンテンツ名.txt`;
do
echo $path `grep $path log.log | wc -l`;
done;
for path in `cat コンテンツ名.txt`;
do
echo $path `grep $path log.log | wc -l`;
done;
これを、
/bin/bash anarysis.sh
で実行してあげると、シェルスクリプトのfor文を使い、コンテンツのファイルを引数としてcatした状態で渡して、ログでgrep検索をかけた状態で、行数をwc -lで集計させて、echoで標準出力させルことができます。
以上で、データ集計を行なえます。どこか間違っている所や、改善点などあれば、教えて下さい!