したがって、access_logというアクセスログエントリファイルがあり、Webサーバーからアクセスされたすべての一意のファイルを見つける必要があります。 access_log の形式は次のとおりです。これは単なる抜粋です。
66.249.75.4 - - [14/Dec/2015:08:25:18 -0600] "GET /robots.txt HTTP/1.1" 404 1012 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.75.4 - - [14/Dec/2015:08:25:18 -0600] "GET /~robert/class2.cgi HTTP/1.1" 404 1012 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.75.4 - - [14/Dec/2015:08:30:19 -0600] "GET /~robert/class3.cgi HTTP/1.1" 404 1012 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
202.46.61.93 - - [14/Dec/2015:09:07:34 -0600] "GET / HTTP/1.1" 200 5208 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"
これらのファイル(たとえば、最初の「robots.txt」)は、GET、HEAD、またはPOSTワードの後にあります。区切り文字としてcutコマンドを使ってみましたが、うまくいきませんでした。ファイルを比較するためにフィールドを区切る方法を知りません。
編集:見つけました。 @ MichaelHomerさんが正しいです。私の構文が間違っているため、cutは機能しません。私はスペースを区切り記号として使用し、効果がありました。
答え1
以下はあなたが提供した例の練習です。
awk
指定できる列と行を印刷します。man
その他の参考資料については、このページとGoogleを確認することをお勧めします。あなたの場合、区切り文字は各列を区切るスペースです。これまでに提供した内容によって、各行に異なるテキストが含まれているため、列の位置が異なるため、異なる場合がありますが、最初の3行の場合は次のように開始できます。
cat access_log | awk 'NR==1,NR==3 {print $7}' | sort -u
NR==1,NR==3
1〜3行を印刷してください。
{print $7}
必要なファイル名である7番目の列を印刷します。各行のテキストが異なる場合があるため、常に7番目の列になるわけではありません。
sort -u
一意の値を出力
出力は次のとおりです
/robots.txt
/~robert/class2.cgi
/~robert/class3.cgi
最後の部分はsort
冗長性がないため、例に違いはありませんが、ファイルの残りの部分がそうである場合は、その特定の列の固有値のみを印刷します。
ファイル名のみを印刷するには、次のコマンドでパラメータを使用できますsubstr
。awk
cat access_log | awk 'NR==1 {print substr($7,2,10)} NR==2,NR==3 {print substr($7,10,10)}'
出力は次のとおりです。
robots.txt
class2.cgi
class3.cgi
説明する:
NR==1 {print substr($7,2,10)}
フィールド 7 の最初の行の場合、位置 2 から始まり、10 文字が印刷されます。
NR==2,NR==3 {print substr($7,10,10)}
フィールド7の2番目から3番目の行は10番目の位置から始まり、10文字が印刷されます。
ファイルの残りの部分は異なる場合があり、常に同じ位置にソートされていないため、列と値を変更する必要があるかもしれませんが、これは開始されます。時間がかかるように見えるかもしれませんが、調査すると正しい方向に行くことができます。
答え2
各固有ファイルヒット数を提供する別のアプローチは次のとおりです。
awk '{print $7}' access_log | sort | uniq -c | sort -rn
または、特定の日付をクリックする前に、日付をgrepすることもできます。
fgrep "14/Dec/2015" access_log | awk '{print $7}' | sort | uniq -c | sort -rn
多少関連している場合は、上記の方法を使用して印刷物を$ 7から$ 1に変更して、サイトの一意の訪問者(少なくとも一意のIP)を見つけることができます。私のサイトがDoS攻撃を受けたら、個人的に同じコマンドを使用してブロックしたいネットワークのIPを見つけます。