web-dev-qa-db-ja.com

nginxアクセスログファイルから/ page1にアクセスしているが/ page2にはアクセスしていないIPアドレスを検索する

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

  1. /page1にのみアクセスしたすべてのIPアドレスを選択する必要があります
  2. /page1にアクセスしたが、/page2にアクセスしたことのないすべてのIPアドレスを選択する必要があります

.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"
3
Delirium
awk '/^\/page1?/ {print $1}' /path/to/access.log | sort -u > result.txt

一意のIPごとにカウントする場合は、sort -usort | uniq -cに変更します。

(行全体ではなく)ログのrequest-pathフィールドのみを/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にアクセスしたが、/page2にアクセスしたことのないIPアドレスを表示するには:

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
cas
  • Page1にアクセスしたIPのソート済みリストを作成します
  • Page2にアクセスしたIPのソート済みリストを作成します
  • 2つのリストで「diff」を使用して、一方のページにアクセスせずにもう一方のページにアクセスしたものを検索します(リストの先頭にある「>」または「<」記号は、Page1とPage2を区別します)
0
xenoid