Linux:JavaScript:awk+cut+sort+uniqでアクセスログを集計し、さらにJavaScriptで集約 の変更点
Top / Linux:JavaScript:awk+cut+sort+uniqでアクセスログを集計し、さらにJavaScriptで集約
- 追加された行はこの色です。
- 削除された行はこの色です。
- Linux:JavaScript:awk+cut+sort+uniqでアクセスログを集計し、さらにJavaScriptで集約 へ行く。
- Linux:JavaScript:awk+cut+sort+uniqでアクセスログを集計し、さらにJavaScriptで集約 の差分を削除
*Linux:JavaScript:awk+cut+sort+uniqでアクセスログを集計し、さらにJavaScriptで集約 [#q7a90067] apacheのアクセスログは、こんな感じのコマンドで、時間ごとのアクセス数を集計できます。 cat access_offer_log | awk '{print $4}' | cut -b 2-15 | sort | uniq -c cat access_log | awk '{print $4}' | cut -b 2-15 | sort | uniq -c このパターンは定石ですなw やっていることは以下の通り -awkで時間の箇所を抽出 -cutで時間までの出力をカット -uniqするためにsortコマンドをかます -uniq -cでユニーク行をカウントし、出力 これで得られる出力は以下の通り 68 03/Dec/2013:16 368 03/Dec/2013:17 141 03/Dec/2013:18 181 03/Dec/2013:19 91 03/Dec/2013:20 15 03/Dec/2013:21 13 04/Dec/2013:11 29 04/Dec/2013:13 21 04/Dec/2013:14 10 04/Dec/2013:17 サーバが1台だったらこれで終了なんだけど、複数台ある、且つログがまとめられない等の事情で、各サーバで上記コマンドを実行した場合、集約するのが大変だったりします。 ***出力結果をJavaScriptで集計 [#gdca75d9] こんな感じのHTMLとJavaScriptで集約できます。 ■shuukei.html <html> <body> <div id="inputDataArea"> <textarea id="target" rows="10" cols="100"> </textarea> </div> <input type="button" id="execute" value="execute"></input> <div > <table> <thead> <tr> <th>key</th> <th>count</th> </tr> </thead> <tbody id="output"> </tbody> </table> </div> <script src="./jquery-1.10.2.min.js"></script> <script src="./shuukei.js"></script> </body> </html> ■shuukei.js $(function(){ var $target = $('#target'), $output = $('#output'), $execute = $('#execute'), i, pushResult,outputTable; $execute.bind("click", function(event){ var targetList = $target.val().split("\n"), sIndex,key,count, keyList, result = {}; for (i=0 ; i < targetList.length ; i++){ pushResult(targetList[i],result); } outputTable(result); event.preventDefault(); }); pushResult = function(line,result){ var tmp,sIndex,key,count; // 行のスペースのトリム tmp = line.replace(/^\s+/g, "").replace(/\s+$/, "").replace(/\s+/g, " "); // 最初のスペースがフィールドの区切り文字 sIndex = tmp.indexOf(" "); // 最初のスペースより左がvalue、右側がkeyとなる count = tmp.substring(0,sIndex); key = tmp.slice(sIndex+1); // 1カラム目が数値でない場合はそのまま返却 if (isNaN(count)){ return; } console.log(key + "\t" + count); // resultにcountをプッシュ key in result ? result[key] = parseInt(result[key]) + parseInt(count) : result[key] = count; } outputTable = function(result){ $output.empty(); var keyList = Object.keys(result),i; for (i=0 ; i < keyList.length; i++ ){ // console.log(key+ "\t"+result[key]); $output.append("<tr><td>" + keyList[i] + "</td><td>"+ result[keyList[i]]+"</td></tr>"); } } }) 「uniq -c」の出力を前提としていますが、ちょっとコードを書き換えるだけでいろいろマージして集計できそうで便利そうw