私のApacheログファイルにはother_vhosts_access.log
次のようなものがあります。
www.example.com:80 12.34.56.78 - - [01/Aug/2017:00:42:18 +0200] "GET /page1.html HTTP/1.1" 200 1542 " "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
www.example.com:80 99.99.99.99 - - [02/Aug/2017:06:19:44 +0200] "GET /test.jpg HTTP/1.1" 200 90749 "" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
www.anotherwebsite.com:80 11.11.11.11 - - [04/Aug/2017:09:39:01 +0200] "GET /test.jpg HTTP/1.1" 200 90749 "" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
...
www.example.com:80 12.34.56.78 - - [23/Aug/2017:01:12:11 +0200] "GET /somethingelse2.html HTTP/1.1" 200 21161 "http://www.example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
訪問した訪問者を探したいです。/page1.html
そして /somethingelse2.html
、この例では12.34.56.78です。
私が使用している場合:
grep page1.html other_vhosts_access.log
残りの行にはが含まれていないため、出力をフィルタリングすることはできませんsomethingelse2.html
。
特定のページ+他のページを訪問した訪問者をどのように見つけることができますか?
ベストアンサー1
bash
、grep
およびawk
:を使用してください。
page1.html
ファイルに関連するすべてのIP番号を取得する方法は次のとおりです。
awk '/page1\.html/ { print $2 }' log
たとえば、データが出力されます12.34.56.78
。
これは、そのIPアドレスを含むすべてのログエントリを取得するために使用できます。
grep -wF -f <( awk '/page1\.html/ { print $2 }' log ) log
これはコマンドの結果をawk
パターンとして使用し、ログファイルを再スキャンしてそのIPを含むすべての行を出力します。これにより、例の最初の行と最後の行が返されます。
フラグは、次のように解釈されるパターン(IPアドレス)を-w
知らせるために使用されます。-F
grep
grep
固定文字列(-F
)これを含む文字列のみを返します。フルワード(-w
)。これは12.34.56.789
、固定文字列パターンが一致しないことを意味します12.34.56.78
。
この結果から、削除するpage1.html
ラインについて
grep -wF -f <( awk '/page1\.html/ { print $2 }' log ) log | grep -vF 'page1.html'
これで、ページ訪問者によって生成されたすべてのログエントリがあります(ページ自体page1.html
ではありません)。page1.html
特定のプロジェクトのアイテムを入手するには特別な別のページを選択し、最後のページgrep -vF 'page1.html'
をgrep -F 'otherpage.html'
。
より強力なログ解析と分析ツールがあると確信していますが、あるとしてもよくわかりません(私はログ解析を頻繁に行いません)。