ログ形式は、「192.168.0.1 - naokun [03/Jun/2002:13:10:02 +0900] ”GET /cgi-bin/test.cgi HTTP/1.1 200 3495」のような形式です。
特定のフォルダ、ファイルごとにソートして切り分けたいです。
シェルかperlで、お勉強サイトの紹介は必要ありませんので、スクリプトのソースそのものが掲載されたサイトをお願いします。
http://it.isogaya.co.jp/wakka/m058
磯谷商店IT事業部( 1000万行のCSV集計 )
一行スクリプトでもできます。
cat hoge.log | perl -ane ’$url = $F[6]; $url =~ s|/|#|g; open(LOG,”>>$url”); print LOG $_; close(LOG);’
http://webmaster.hatena.ne.jp/1066107338
Apache のログ解析をやるために、アクセスログの切り分けスクリプト探しています。自分でつくった Perl のはあるのですが、http://it.isogaya.co.jp/wakka/m058定番で、per.. - 人力検索はてな
類似の質問です。
http://www.namazu.org/~tsuchiya/perl/info/perl-ja_51.html
The Perl5 Manual - 実行とオプション
#1のmcqです。#1で提示したURLがどちらもご要望を満たせず、申し訳ありません。
このような質問に回答が少ないのは、「具体的」であり過ぎる為、完全に同じ問題を解説するサイトが見つからない為でしょう。ですから、すぐに使えるスクリプトをお求めなら、回答者にURL検索ではなくコーディングを求める事となり、回答できる人も限られますし、時間も掛かります。回答者にもよりますが、手間の割にポイントが低いのでパス、という人も居るでしょう。
さて、正規表現が苦手という事ですので前述の一行スクリプトを簡単に解説したいと思います。ちなみに、一行スクリプトは実行してみていないのでしょうか。そのままでも一応、COMMON形式のログをURLごとに切り分け出来きるので、ご質問の条件には一致してると思います。
”cat hoge.log | perl -ane”はお分かりと思いますが、hoge.logの各行について、対象の行を$_に読込み、スペースで区切って@Fに代入し、以降のスクリプトを実行します。
次に、common形式において引用符を無視すれば、スペースで区切られる要素の7番目がURLですので、”$url=$F[6]”とします。
ここで、URLをそのまま出力ファイル名としてしまうと都合が悪いので、今回は”$url =~ s|/|#|g”としてURL中の”/”を全て”#”に置換しています。
残りは、置換された$urlを出力先として、ログの一行を丸ごと追記しています。
ちなみにこのスクリプトでは、実行したフォルダにやたらと長いファイル名のログが散乱してしまい、あまり綺麗でないので、以下の様にすれば階層分けできます。
cat hoge.log | perl -ane ’open(LOG,”>>.$F[6].log”); print LOG $_; close(LOG);’
丁寧な解説、ありがとうございます。
アドバイスを参考にがんばってみようと思います。
申し訳ありませんが、こちらの質問でも解決策が一つも提示されていないようで…。
この手の即効・実利を求める質問は回答がつきにくいのでしょうか?
sendmailにリダイレクトする予定なので、MySQLを使う方法は困ります。
上のスクリプトは非常に参考になりましたが、正規表現を使っていますね。ログの形式もCOMMONではなくCOMBIND形式みたいですし。
URLごとに切り分けという要望を満たすためには、細かいカスタマイズが必要になると思いますが、当方正規表現と再帰処理が大の苦手で…。
他に方法がなければ、いやでも勉強せざるを得ませんが。
できれば質問の詳しい解説つきのものか、質問の条件に合致するものでお願いします。