ログファイルから特定のデータを選択する必要があります。 2つのスクリプトが必要です。
/page1
にのみアクセスしたすべてのIPアドレスを選択する必要があります/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"
awk '/^\/page1?/ {print $1}' /path/to/access.log | sort -u > result.txt
一意のIPごとにカウントする場合は、sort -u
をsort | 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
を参照してください。