nginxアクセスログファイルで、/ page1にはアクセスするが/ page2にはアクセスしないIPアドレスを見つけます。

nginxアクセスログファイルで、/ page1にはアクセスするが/ page2にはアクセスしないIPアドレスを見つけます。

ログファイルから特定のデータを選択する必要があります。 2つのスクリプトが必要です。

  1. 訪問したことがあるすべてのIPアドレスを選択する必要があります。/page1
  2. /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

おすすめ記事