0

過去のユニーク ビジター (IP アドレスで識別) に関する 1 回限りのレポートを作成し、デフォルト形式の Apache アクセス ログから日付と OS で整理する必要があります。例:

Date OS    Count
3/1 iPhone 23
3/1 Windows 402
3/2 iPhone 32
etc..

今日、私は多数のツール (Octupussy、AWStats、goaccess、apachetop) を試しましたが、この方法でログを分割する機能を提供するものは見つかりませんでした。OS レポートはこれらすべてにありますが、日ごとではなく、ログ全体です。その機能を備えたものを知っている人はいますか?

また、ログをループして正規表現またはシステムの grep/awk コマンドを使用する python プログラムを作成することを検討していますが、簡単なツールがある場合、または awk で簡単に実行できる場合は、ナッジをいただければ幸いです。今日まで awk を使用したことはありませんが、かなり強力で、経験があれば簡単にできるようです。

4

2 に答える 2

2

サンプル出力に IP アドレスが含まれていません。出力に IP アドレスが含まれている回答を書いています。

私のApacheaccess.logファイルのサンプルログ行:

27.0.0.1 - - [28/Oct/2012:21:38:34 +0530] "GET /phpmyadmin HTTP/1.1" 301 559 "-" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4"

使用している OS に基づいて 1 日あたりのユニーク ビジター数を取得するには:

awk '$6 ~ /GET/ \
{ gsub("[[]", "", $4); \ 
gsub(":.*", "", $4); \
print $1,$4,$14}' access.log | \

sort -t ' ' -k 2 | \
uniq -c|awk '{print $3,$2}'|uniq -c|awk '{print $3, $2, $1}'

次の回答は、OS ごとの IP ごと、日付に基づく一意のユーザーに対するものです。

上記から必要な出力を取得するための 1 つのライナー:

awk '$6 ~ /GET/ \
{ gsub("[[]", "", $4); \ 
gsub(":.*", "", $4); \
print $1,$4,$14}' access.log | \

sort -t ' ' -k 2 | \
uniq -c|awk '{print $3,$2,$4,$1}'

説明:

最初の awk 行は、GETリクエストで行をフィルタリングすることです。

2 番目の awk 行は、余分な右角かっこを削除するためにあり[ます。

3 行目は、Apache ログの日時フィールドから時間を削除します。

4 行目は必須フィールドを出力します。

5 行目は、日付に基づいて出力を並べ替えます。

最後に、uniqと をawkもう一度使用して、必要な形式で出力を印刷します。

出力:

28/Oct/2012 127.0.0.1 Linux 1
于 2013-03-30T09:25:53.043 に答える
0

結合されたログ形式については、次のようにスキャンできます。

In [1]: import re

In [2]: text = '127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"'

In [3]: logitems = re.compile('^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) ([^ ]*) ([^ ]*) \[([^\]]*)\] "([^"]*)" \d+ \d+ "([^"]*)" "([^"]*)"')

In [4]: logitems.findall(text)
Out[4]: [('127.0.0.1', '-', 'frank', '10/Oct/2000:13:55:36 -0700', 'GET /apache_pb.gif HTTP/1.0', 'http://www.example.com/start.html', 'Mozilla/4.08 [en] (Win98; I ;Nav)')]

textにログファイルのテキストが含まれていると仮定すると、 を使用re.findallすると、必要な情報を含むタプルのリストが生成されます。

このタプルのリストがあり、リスト内包表記とセットを使用して一意の IP を取得するとします (ここでは、デモ目的で単純な 2 タプルを使用しています)。

In [4]: lst = [('127.0.0.1', 'foo'), ('192.168.0.1', 'bar'), ('123.022.200.023', 'baz'), ('127.0.0.1', 'double')]

In [5]: [i[0] for i in lst]
Out[5]: ['127.0.0.1', '192.168.0.1', '123.022.200.023', '127.0.0.1']

In [6]: list(set([i[0] for i in lst]))
Out[6]: ['192.168.0.1', '123.022.200.023', '127.0.0.1']

すべての IP アドレスについて、すべてのアクセスを取得できます。

In [8]: [i for i in lst if i[0] == '127.0.0.1']
Out[8]: [('127.0.0.1', 'foo'), ('127.0.0.1', 'double')]

datetime.datatime次に、日付 ( ! に変換) と OSでさらにフィルター処理できます。

于 2013-03-30T09:39:10.663 に答える