linux awkコマンドhttp serverアクセスログの分析

6476 ワード

AWKの概要
AWKは「スタイルスキャンと処理言語」です.これにより、入力ファイルの読み取り、データのソート、データの処理、入力の計算、レポートの生成など、短いプログラムを作成できます.その名前は創始者のAlfred Aho、Peter Weinberger、Brian Kernighan姓の最初のアルファベットから取った.
本明細書で説明するawkコマンドは、主にLinuxオペレーティングシステムに広く含まれる組み込みプログラム/bin/gawkを指し、Unix awkプログラムのGNUバージョンである.このコマンドは主にAWK言語で作成されたプログラムの読み込みと実行を担当します.Windowsプラットフォームでは、Cygwinを使用してシミュレーション環境でawkコマンドを実行できます.
基本的にawkは、入力(標準入力、または1つ以上のファイル)から指定したモードのレコード(すなわちテキスト行)が存在するか否かを入力することができる.一致が検出されるたびに、関連するアクション(標準出力や外部ファイルへの書き込みなど)が実行されます.
AWK言語ベース
AWKプログラムを理解するために,以下にその基本知識を概説する.AWKプログラムは、1つのモードと動作の組み合わせを含む1行または複数行のテキストから構成され得る.
 pattern { action }

パターン(pattern)は、入力内の各行のテキストを一致させるために使用されます.一致する行ごとにawkは対応する 動作(action).モードとアクションの間にかっこで区切ります.awkは各行のテキストを順次スキャンし、 レコード区切り記号(通常は改行記号)は、読み出された各行を レコード ドメイン区切り文字(一般的にスペースまたはタブ)1行のテキストを複数に分割 ドメインです.各ドメインは$1,$2,...$nで表されます.$1は第1のドメインを表し、$2は第2のドメインを表し、$nは第nのドメインを表す.$0はレコード全体を表します.モードまたはアクションは指定せず、デフォルトモードの場合、すべてのローが一致します.デフォルトのアクションの場合、アクション{print}が実行され、レコード全体が印刷されます.
awkを使用してログ内の情報を分解
IBM HTTP Serverプロファイルでアクセスログの固定フォーマットを指定したため、awk解析を簡単に使用して必要なデータを抽出できます.
次のログの例を示します.
 202.189.63.115 - - [31/Aug/2012:15:42:31 +0800] "GET / HTTP/1.1" 200 1365 "-" 
 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1"
  • $0は、記録行全体
  • である.
  • $1はIPにアクセスする」202.189.63.115"
  • $4がリクエスト時間の前半である「[31/Aug/2012:15:42:31」
  • $5がリクエスト時間の後半「+0800」
  • である.
    このように......
    デフォルトのドメイン分割子を使用すると、ログから次の異なるタイプの情報を解析できます.
     awk '{print $1}' access.log       # IP     (%h) 
     awk '{print $2}' access.log       # RFC 1413     (%l) 
     awk '{print $3}' access.log       #    ID  (%u) 
     awk '{print $4,$5}' access.log     #        (%t) 
     awk '{print $7}' access _log      #  URI (%>s) 
     awk '{print $9}' access _log      #     (%>s) 
     awk '{print $10}' access _log     #       (%b)

    デフォルトのドメイン区切り文字のみを使用すると、要求行、参照ページ、ブラウザタイプなどの他の情報を解析するのに不便であることがわかります.これらの情報には不確定な数のスペースが含まれているためです.したがって,ドメイン区切り記号を「に変更すれば,これらの情報を簡単に読み取ることができる.
     awk -F\" '{print $2}' access.log        #     (%r) 
     awk -F\" '{print $4}' access.log        #     
     awk -F\" '{print $6}' access.log        #    

    注意:ここではUnix/Linux Shellの「文字列の始まり」という誤解を避けるために、反スラッシュを使用し、エスケープしました」.
    今、awkの基本的な知識と、それがどのようにログを解析しているのかを把握しています.次は、実際の世界で「冒険」を始める準備をしています.
    トップに戻る
    awkシーンの使用例
    統計ブラウザのタイプ
    これらのタイプのブラウザがWebサイトにアクセスし、表示された回数で並べ替えられていることを知りたい場合は、次のコマンドを使用します.
     awk -F\" '{print $6}' access.log | sort | uniq -c | sort -fr

    このコマンドラインは、まずブラウザドメインを解析し、パイプを使用して最初のsortコマンドの入力として出力します.最初のsortコマンドは、主にuniqコマンドが異なるブラウザで発生した回数を統計するのを容易にするために使用されます.最後のsortコマンドは、前の統計結果を逆順に並べて出力します.
    システムに問題があることを発見する
    次のコマンドラインを使用して、サーバが返すステータスコードを統計し、システムに問題がある可能性があることを発見することができます.
     awk '{print $9}' access.log | sort | uniq -c | sort

    通常、ステータスコード200または30 xは最も多く発生するはずです.40 xはクライアントアクセスの問題を表します.50 xは一般的にサーバ側の問題を表します.
    次に、一般的なステータスコードを示します.
  • ,200-要求は成功し、要求された応答ヘッダまたはデータボディはこの応答に従って返される.
  • 206-サーバはGET要求の一部を正常に処理した
  • 301-要求されたリソースは、新しい場所
  • に永続的に移動する.
  • 302-要求されたリソースは、現在、異なるURI応答要求
  • から一時的に応答する.
  • ,400-エラーのリクエスト.現在のリクエストはサーバに理解できません.
  • 401-要求は許可されていません.現在の要求にはユーザー検証が必要です.
  • 403-アクセス禁止.サーバは要求を理解しているが、実行を拒否している.
  • 404-ファイルは存在せず、リソースはサーバ上で発見されなかった.
  • ,500-サーバは予期せぬ状況に遭遇し、リクエストの処理を完了できませんでした.
  • 503-一時的なサーバのメンテナンスまたはオーバーロードのため、サーバは現在要求を処理できません.
  • HTTPプロトコルステータスコード定義関連項目:Hypertext Transfer Protocol--HTTP/1.1
    ステータスコードに関するawkコマンドの例:
    1.すべてのステータスコード404の要求を検索して表示する
     awk '($9 ~ /404/)' access.log

    2.統計すべてのステータスコード404の要求
     awk '($9 ~ /404/)' access.log | awk '{print $9,$7}' | sort

    次に、あるリクエスト(例えばURI:/path/to/notfound)が404エラーを大量に発生したと仮定し、このリクエストがどの参照ページから来たのか、どのブラウザから来たのかを次のコマンドで見つけることができます.
     awk -F\" '($2 ~ "^GET /path/to/notfound "){print $4,$6}' access.log

    誰がチェーンサイトのピクチャーを盗んでいることを追跡します
    システム管理者は、他のWebサイトが何らかの理由で自分のWebサイトに保存されている画像を使用していることに気づくことがあります.自分のWebサイトの画像を使用する権限がない人がいるかどうかを知りたい場合は、次のコマンドを使用します.
     awk -F\" '($2 ~ /\.(jpg|gif|png)/ && $4 !~ /^http:\/\/www\.example\.com/)\ 
     {print $4}' access.log \ | sort | uniq -c | sort

    注意:使用前にwww.example.comを自分のサイトのドメイン名に変更します.
  • は、各行を分解するために使用される.
  • 要求ラインには「.jpg」、「.gif」または「.png」が含まれなければならない.
  • 参照ページは、Webサイトのドメイン名文字列で開始されません(この例ではwww.example.com).
  • は、すべての参照ページを表示し、出現回数を統計します.

  • IPアドレスへのアクセスに関するコマンド
    IPアクセスの合計数を統計します.
     awk '{print $1}' access.log |sort|uniq|wc – l

    各IPがどのくらいのページにアクセスしたかを統計します.
     awk '{++S[$1]} END {for (a in S) print a,S[a]}' log_file

    IPアクセスごとのページ数を小さい順に並べ替えます.
     awk '{++S[$1]} END {for (a in S) print S[a],a}' log_file | sort -n

    202.106.19.100などのIPがアクセスしたページを表示します.
     grep ^202.106.19.100 access.log | awk '{print $1,$7}'

    2012年8月31日14時以内にどれだけのIPアクセスがあるかを統計します.
    awk '{print $4,$1}' access.log | grep 31/Aug/2012:14 | awk '{print $2}'| sort | uniq | \
    wc -l

    統計アクセスが最も多い上位10のIPアドレス
     awk '{print $1}' access.log |sort|uniq -c|sort -nr |head -10

    応答ページサイズのコマンド
    転送サイズが最大のファイルをいくつかリストします.
     cat access.log |awk '{print $10 " " $1 " " $4 " " $7}'|sort -nr|head -100

    出力が20480 byte(200 kb)より大きいページと対応するページの発生回数をリストします.
     cat access.log |awk '($10 > 200000){print $7}'|sort -n|uniq -c|sort -nr|head -100

    ページレスポンス時間に関するコマンド
    ログの最後の列にページファイル転送時間(%T)が記録されている場合、たとえばログフォーマットをカスタマイズできます.
     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %T" combined

    次のコマンドを使用して、応答時間が3秒を超えるすべてのログを統計できます.
     awk '($NF > 3){print $0}' access.log

    注意:NFは、現在のレコードのドメイン数です.$NFは最後のドメインです.
    5秒を超えるリクエストのリスト
     awk '($NF > 5){print $0}' access.log | awk -F\" '{print $2}' |sort -n| 
     uniq -c|sort -nr|head -20

    転載先:https://blog.51cto.com/liubin0505star/1533105