バッシュスクリプトApacheのログ
昨年、私は、ほぼ100のWebログを書きました。
今年は以上ですが、私は記事の中で最も人気がありますかを確認するために、「トラフィックランキング」をカウントします。(グランド予告:この記事の最後にはトップ5を明らかにする)
過去には、私が使用しAWStatsののログ解析ソフトウェアを。それは非常に詳細なレポートを生成ではなく、非常に簡単にカスタマイズするために、必要ないくつかの情報を得ることができます。だから、私は、スクリプトのログ、統計サーバのバッシュ、スクリプトの知識をブラッシュアップする方法を書くことにしました。
それは私が予想よりも難しいことが判明しました。最後のスクリプトだけで20行が、しかし、私は繰り返し、マニュアルを読み、適切なパラメータを使用することを確認して、一日を過ごしました。ここでは一般的ではありませんが、私のログ解析スクリプトは、ですが、私は、コマンドの内部で使用することを信じて、ログ解析の一般的なニーズを満たすのに十分でなく、バッシュの例を学ぶ良いです。あなたが知っている次の各コマンドならば、私たちはバッシュの熟練使用呼び出すことができると思います。
まず、動作環境
スクリプトを導入する前に、私は、サーバー環境について講演します。
私のウェブサーバソフトウェアApacheは、それが以下このように、すべてのHTTP要求の記録を残します。
203.218.148.99 - - [01/2月/ 2011:00:02:09 0800] "GET /blog/2009/11/an_autobiography_of_yang_xianyi.html HTTP / 1.1" 200 84058「http://www.ruanyifeng.com/blog /2009/11/freenomics.html」の "Mozilla / 5.0(Windowsの; U; Windows NTの5.1; ZH-TW; RV:1.9.2.13)のGecko / 20101203 Firefoxの/ 3.6.13"
これは、2011年2月1日には、IPアドレスは、サーバーのURLを/blog/2009/11/an_autobiography_of_yang_xianyi.htmlへのアクセスを要求する訪問者の203.218.148.99であることを意味します。
記録への終日アクセス、ログを形成します。ここ数年、365個のログファイルの合計を生成します。彼らは、ログファイルは、WWW-02 WWW-01.logをした内、(2011-01,2011-02、...... 2011-12)を各ディレクトリには、月を表し、12のディレクトリに格納されています。ログ、...... WWW-31.logは(月は31日持っていると仮定して)。
圧縮せずに、365個のログファイル一緒に、スペースの10ギガバイトを占めています。私の目標は、これらのログ10ギガバイトを分析し、そして最後に、フォームのランキングのトラフィックを得ることです:
1回のウェブサイトの訪問
訪問2ウェブサイトの
トラフィックのウェブサイト3
...... ......
第二に、なぜあるべきバッシュ
このタスクを達成するために使用することができ、多くのコンピュータ言語。あなたは、単にログ解析しかし、もし、私はbashのスクリプトは、最も適切なツールだと思います。
2つの主な理由があります:まず、「急速な発展は、」、Bashのスクリプトは、さまざまなLinuxコマンドの組み合わせであり、単にこれらのコマンドを使用する方法を知っている、あなたはスクリプトを書くことができ、基本的には新しい構文を習得する必要はありませんが、それはコンパイルする必要はありません、直接実行します缶テストを書きながら、開発は非常に友好的です。第二は、bashのスクリプトに設計された「強い機能」であるハンドル入力と出力、テキストの特に単一の行にある、それは非常に適切なログファイルに加え、既製の引数のパイプライン機構の様々な、無限の力です。
すでに述べたように、最後のスクリプト私は結果を得るために20秒程度、20本の以上のライン、ログの10ギガバイトを過ごしました。計算ソートの膨大な量を考えると、このような結果は、バッシュのパワーを示す、非常に良好です。
第三に、一般的な考え方
私の全体的な処理の考え方はこれです:
単一のログを処理するための最初のステップ。統計ごとに各記事への日帰り訪問。
第二段階は、毎月のランキングを生成します。毎日の結果の統計的な概要は、毎月の訪問を取得します。
第3のステップは年間ランキングを生成することです。ソートの概要、年間の訪問の12ヶ月の統計結果。
第四に、単一のログの処理
一例として、2011年1月1日をログに記録するには、それは2011-01ディレクトリにある、ファイル名は次の形式100 000を記録しているWWW-01.logは、次のとおりです。
203.218.148.99 - - [01/2月/ 2011:00:02:09 0800] "GET /blog/2009/11/an_autobiography_of_yang_xianyi.html HTTP / 1.1" 200 84058「http://www.ruanyifeng.com/blog /2009/11/freenomics.html」の "Mozilla / 5.0(Windowsの; U; Windows NTの5.1; ZH-TW; RV:1.9.2.13)のGecko / 20101203 Firefoxの/ 3.6.13"
ログ処理、私は1行のコードを持っていました:
awkの '$ 9 == 200 {$ 7印刷}' WWW-01.log | grep -i '^ /ブログ/ 2011 /.* \ htmlの$。' | 並べ替え| uniqの-c | SEDさん/ ^ * // G '> WWW-01.log.result
私たちが順番に見て、それぞれが非常に簡単です、5つのコマンドをパイプされます:
(1)AWK WWW-01.log '$ 9 == 200 {$ 7印刷}'
スペースでawkコマンドのデフォルトは、テキストの各行には、いくつかのフィールドに分割されます。慎重にそれを数え、我々は唯一の最初の7つの分野、すなわち、URLのhttpリクエストを必要とする、{$ 7印刷する}最初の7つのフィールド出力を表し、結果は次のとおりです。
/blog/2009/11/an_autobiography_of_yang_xianyi.html
私たちは、つまり9つのフィールドは200でなければならない、「$ 9 == 200」と書かれたので、サーバーは、(成功のための)ステータスコード200でなければならない、制約を追加、考慮にそうでない場合は何も出力を要求する統計的な成功のみを取らない7フィールド。
私は無視していたここで、簡単な解決方法を考えることはできませんので、細かい統計は、また、実際のWebスパイダーと訪問者を区別する必要があります。
(2)はgrep -i '^ /ブログ/ 2011 /.* \。htmlの$'
統計への出力のすべてのレコードの最初の7つのフィールドではなく、すべてのレコードのニーズの中で。私の記事によると命名、彼らは「/ブログ/ 2011 /」を持つすべてのURLは、末尾に「.htmlを」で始まる必要があります。だから、私はこれらのレコードを見つけるために、正規表現 "^ /ブログ/ 2011 /.* \。htmlの$" を使用します。パラメータiは、ケース・小文字を区別しないを表します。
(3)ソート
このとき、必要なすべての統計レコードがリストされている必要がありますが、その順序は厄介です。次に、sortコマンドではなく、順序の目的が、URLと同じ構成のため、コマンドuniqのその後の使用のための条件を作成します。
(4)UNIQ -C
uniqの役割は、一列のみを残して、重複レコードをフィルタリングすることです。出現回数を加算Cアクションパラメータは、各行の先頭に記録されます。出力を処理した後、次のようになります。
32 /blog/2011/01/guidelines_for_english_translations_in_public_places.html
32 /blog/2011/01/api_for_google_s_url_shortener.html
30 /blog/2011/01/brief_history_of_arm.html
それは、1月1日のログにつ以上の記事を表し、それぞれ、レコードの32、32、30(すなわち訪問)へのアクセス権を持っています。
(5)のsedの/ ^ * // G '> WWW-01.log.result
前の訪問uniqのコマンドが追加、スペースをリードしています。すなわち、先頭のスペースを省略し、その後の操作を容易にするために実施形態の前のスペース32,32,30のシリーズがあります。sedコマンドの処理は、テキストエディタのラインで、「S / ^ * // G」は、正規表現(^と*との間の空間)であり、番組が連続最初の行を交換する空のスペース(すなわち、削除)されています。次に、ファイルWWW-01.resultにリダイレクトソート結果。単一のログ分析が完了しています。
第五に、毎月の要約ランキング
前のステップの後、1月31日のログファイルは、31に対応する解析結果ファイルを生成しました。月全体の概要については、これは、ファイルが31をマージするならなければなりません。
(6)合成結果
私WWWでのために- 。log.result *
やる
猫の$を私は>> log.resultが
行われ
これは、環状構造、文書のフォーム内のすべてのWWW-01.log.resultで、ファイルがlog.result書かれています。
その後、私は毎月のランキングを算出し、1行の文を使用していました。
ソート-k2 log.result | UNIQ -f1 --all-繰り返さ=別々| ./log.awk |ソート-rn> final.log.result
3つのコマンドやawkスクリプトによってこのラインステートメントは、で構成されています。
(7)ソート-k2 log.result
それは31の文書の要約、レコードは順不同ですlog.resultファイルですので、あなたが一緒にグループ化された同じURLを記録しますsortコマンドを使用する必要があります。しかし、この場合には、アクセスの数は、第2のフィールドは、このように第2のフィールドを表すK2パラメータに従って順序付けられ、URLであり、最初のフィールドです。
(8)UNIQ -f1 --all反復=別
uniqの役割はバックフィールド(URL)を考慮し、重複するレコードをフィルタリングするために最初のフィールドf1(訪問)を省略するためのパラメータであり、パラメータは一度だけ、すべてのレコードからフィルタを示す、独立した=すべて-繰り返し示し、リテンションすべての重複レコード、および各セットの間に空白行で区切られています。これが完了すると、出力は次のような形式になり:
617 /blog/2011/01/guidelines_for_english_translations_in_public_places.html
455 /blog/2011/01/guidelines_for_english_translations_in_public_places.html223 /blog/2011/01/2010_my_blogging_summary.html
253 /blog/2011/01/2010_my_blogging_summary.html
セットの同じURLのプロパティで、グループ間の空白行で割りました。簡潔にするために、上記の例では、各グループは、実際には、各セットは、(月の日あたりの訪問の数を表す)31件のレコードを含む、2つだけのレコードを含みます。
(9)log.awkスクリプト
31日間の訪問の合計のために、私は脳の多くを移動します。最後に、我々は唯一の方法は、awkのコマンドを使用することであることがわかった、もう一方はawkスクリプトを記述する必要があります。
#!は/ usr / binに/ awkの-f
{BEGIN
ブランクラインとしてRS =「」#複数の行区切りを
}{
SUM = 0#初期値は0であるの和を表す変数を定義
するための(。; I <= NFの、I = 1のI ++){#のすべてのフィールドを介して
{#かどうかを判定した場合((I%2)= 0 !) 奇数フィールドの
合計+ = $ I#そうであれば、これらのフィールドの累積値が
}
}
対応するURLを保つために、$#2の出力合計バックを合計を印刷
}
私はこの上にしてきたlog.awkスクリプトは、詳細なメモを追加しました。ここで再びポイントの数は:まず、デフォルトで、「\ n」はレコードの区切りとして、設定されたRSをawkは=「」このように、マルチ行を形成し、セパレータとしての空の行に示し、第二に、NFのAWKは組み込み変数現在の行のフィールドの総数を示しています。入力ファイルでは、各ラインが2つのフィールドが含まれているので、最初の番号がアクセスされ、第二に限り蓄積する奇数フィールドとして、決意条件を作成するので、ここで、URLであり、その後、偶数フィールドは常にスキップされます。最後に、各レコードとURLの積算値の出力は、それらの間のスペースで割りました。
(10)ソート-rn> final.log.result
AWKスクリプトは、最初のフィールドにソート、ソートのデフォルトの結果を処理し、パラメータrが大から小吐出に、逆を表し; nは、デフォルト辞書形式でソートされていない、10未満2が存在するであろう、数値形式でソートパラメータを示します結果。ソート結果はfinal.log.resultにリダイレクト。これまでのところ、毎月の順位が完了しています。
第六に、スクリプトファイル
上記の二つの内容のすべてを含むスクリプト付き。
#!/ binに/ bashの
LSは./*.result&>は/ dev /場合はnull# で、現在のディレクトリの結果をという名前のファイルが存在するかどうかを判断するために、接尾辞
、その後
*#.ResultあればRMは、これらのファイルの削除
Fiを提供してタッチlog.result#が空のファイルを作成します
。私のWWWでのために-現在のディレクトリ内のすべてのログファイルを*ログ#
行う
エコー$ I ...#出力ラインを、現在のファイルの処理の開始を示している
のawk「$ 9 == 200を{印刷 $ 7}」$ I |はgrep -i '^ /ブログ/ 2011 /.*。 \ htmlの$' |並べ替え| uniqの-c | sedのの/ ^ * // G '> $ i.result#が発生する現在のログ処理結果
猫の$ i.result >> log.result#log.resultファイルに追加結果を処理することは
$ i.result完成#出力ラインをエコー、処理現在のファイルの終わりを示し
て行わエコーfinal.log.result ...#出力ライン、および最終統計の始まりを表し、
ソート-k2 log.result |ソート-rn> final.log.result#最終成果文書のfinal.log.resultを生成| ./log.awk | uniqは-f1 --all-繰り返さ=を分離します
エコーfinal.log.result完成#出力ライン、およびエンドは、最終的な統計情報を表し、
これは、毎月の順位で、最終的なスクリプト。執筆時点では、私は同じディレクトリにこのスクリプトとlog.awkスクリプトとログファイルを想定し、両方のスクリプトが実行権限を持っています。
これと同様の年間ランキングを処理、我々はそれらを繰り返すことはしません。
================================================== ===============
スクリプト記述では、ここで終了します。
次は、私は5件の記事を訪問し、2011年に発表しました。
第五に、「私のGoogle AdSenseのアカウントが閉鎖されました」
私は実際にGoogle AdSenseの中国チームのメンバーを聞きたい:「あなたはロボットですしないでくださいしないでくださいは、不正なあなたが本当にデューデリジェンス作業を行う場合には、まともなサイトで、ウェブサイト、または無責任なやり方であるものが表示されません?人間の生活のために無視?」
第四に、「ジョブズ別れ」
Steve Jobsは、病気の秘密、彼の体調がない知識の外に生きていました。今、彼はすべての側面についての情報によると、死亡した私たちは最終的には生と死に対処する方法を知って、彼のような偉大な人を自分の医療記録を復元することができ、明らかにしました。
これに先立ち、彼はかろうじてさえスポーツのため、ゴルフをした非常に興味を持っていません。彼の計画は、6年間に密着練習に練習の辞任1日6時間、週6日後に、という万時間以上の合計で、その後、プロ選手になりました。彼は「ダンプラン」と呼んでいます
第二には、「シンプル----慶功劇場デニス・リッチー•(デニス・リッチー)それを維持します」
•13歳のデニス・リッチー(デニス・リッチー)は、その父親とニュージャージーに来ました。当時、誰もが、この静かな少年は生涯のためにここに滞在することになり、そして世界を変える発明を作成することを考えていません。
あなたは、30×30のテーブルを描くことができ、およびA4の紙で十分です。グリッド内の各受け渡し月、ちょうどダニ付き。あなたの全体の生命は、紙のこの作品です。そのため、明確なアイデアを持っています。あなたの人生を無駄にする方法。
(終わり)