ログファイルから特定のデータを選択する必要があります。 2つのスクリプトが必要です。
- 訪問したことがあるすべてのIPアドレスを選択する必要があります。
/page1
/page1
訪問したが訪問したことのないすべてのIPアドレスを選択する必要があります。/page2
私が.tar
望むログはファイルにあります。フォルダに抽出し、スクリプトを使用して解析して削除します。すべての冗長IPアドレス。
これが私が今まで持っているものです:
# filter /page1 visitors
cat access.log | grep "/page1" > /tmp/res.txt
# take the IP portion of record
cat res.txt | grep '^[[:alnum:]]*\.[[:alnum:]]*\.[[:alnum:]]*\.[[:alnum:]]*' -o > result.txt
一般的なアクセスログは次のとおりです。
162.158.86.83 - - [22/May/2016:06:31:18 -0400] "GET /page1?vtid=nb3 HTTP/1.1" 301 128 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0"
答え1
awk '/^\/page1?/ {print $1}' /path/to/access.log | sort -u > result.txt
一意のIPあたりの数が必要な場合は、sort -u
次のように変更します。sort | uniq -c
行全体ではなく要求パスフィールドのみを記録するには、次のようにします/page1
。
awk '$7 ~ /^\/page1?/ {print $1}' /path/to/access.log | sort -u > result.txt
注:nginxアクセスログはApacheアクセスログと同じだと思います。それ以外の場合は、フィールド数を数えます(数すべてスペース(nginxログのDate:TimeとTimeZoneの間のスペースを含む)を使用し、代わりに正しいフィールド番号を使用してください。$7
最後に、IPアドレス(または解決された場合はホスト名)と要求パスを印刷するには、次の手順を実行します。
awk -v OFS='\t' '$7 ~ /^\/page1?/ {print $1, $7}' /path/to/access.log |
sort -u > result.txt
訪問したが/page1
訪問したことのないIPアドレスを見る/page2
:
awk '$7 ~ /^\/page1?/ {print $1}' /path/to/access.log | sort -u > result1.txt
awk '$7 ~ /^\/page2?/ {print $1}' /path/to/access.log | sort -u > result2.txt
comm -2 -3 result1.txt result2.txt
comm
このオプションは、両方の-2
ファイルにのみ表示される行result2.txt
と-3
両方のファイルに表示される行を抑制します。したがって、に表示される行のみが出力されますresults1.txt
。
詳細についてはを参照してくださいman comm
。
答え2
- Page1にアクセスしたIPのソートされたリストを作成します。
- Page2にアクセスするIPのソートされたリストを作成します。
- 両方のリストで「diff」を使用して1ページを訪問しましたが、他のページは訪問していないページを見つけます(リストの先頭の「>」または「<」記号は1ページと2ページを区別します)。