NCSA 結合ベースのログファイルを解析する方法

NCSA 結合ベースのログファイルを解析する方法

私は Server Fault、Super User、Stack Overflow で Google を使って少しsite:検索してみました。また、サイト固有ではない結果も確認しましたが、このような質問は見当たらなかったので、ここに投稿します...

私は見つけたこの質問はgrepとawkに関連しています素晴らしい知識が含まれていますが、テキストの適格性の課題が解決されていないように感じます。この質問は、範囲をあらゆるプラットフォームやプログラムに広げます。

NCSA 統合フォーマットに基づいた Squid または Apache ログがあります。ベースとは、ファイルの最初の n 列が NCSA 統合標準に準拠しているという意味ですが、カスタム要素によって列が増える可能性があります。

以下は、Squid の結合ログの行の例です。

1.1.1.1 - - [11/Dec/2010:03:41:46 -0500] "GET http://yourdomain.com:8080/en/some-page.html HTTP/1.1" 200 2142 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; C) AppleWebKit/532.4 (KHTML, like Gecko)" TCP_MEM_HIT:NONE

nログを解析して特定の列を出力し、並べ替え、カウント、一意の値の検索などを実行できるようにしたい

主な課題であり、少し難しい点であり、またこの質問がまだ尋ねられておらず、答えられていないと感じる理由は、テキスト資格の難問

私が見つけたときSQL のgrep/awk の質問から、私はとても興奮していましたが、すぐに使用できる状態では combined がサポートされていないことに気付きました。これは、おそらく拡張することを検討することになるでしょう。

回答を楽しみにしています。新しいことを学びたいです。回答はプラットフォームやプログラム/言語に限定される必要はありません。この質問の文脈では、私が最もよく使用するプラットフォームは Linux または OSX です。

乾杯

答え1

Perl を使用し、darwin-thread-multi-2level (OSX) 用にビルドされた v5.10.0 でテスト済み

UserAgent 列を印刷するには:

perl -n -e '/^([^ ]+) ([^ ]+) ([^ ]+) (\[[^\]]+\]) "(.*) (.*) (.*)" ([0-9\-]+) ([0-9\-]+) "(.*)" "(.*)"/; print "$11\n"' -- test.log
  • オプション-nの各行test.log
  • オプション-e1 行プログラム

私はグーグルで調べたパールを盗んで微調整しましたPHPクックブックより$NCSA Combined に基づくカスタム フォーマットをサポートするために、 re の末尾から を削除しました。パターンは簡単に拡張でき、より多くのグループを提供できます。

正規表現グループは()ローカル変数$1として$n

素早く簡単に拡張およびスクリプト化できます。

出力をパイプする例をいくつか示します。

  • | sort | uniq一意の列値
  • | sort | uniq | wc -l一意の列数

批判や改善は歓迎します

答え2

テキストの修飾に直接対処するわけではありませんが、結合形式で利用できる要素の 1 つは、残りのスペースで区切られた列が一貫して同じ列にあることです。したがって、printf と NF (列数) を使用したループを使用して問題を回避できます。

awk によれば、$0 は入力行全体、$1 は最初の列、$2 は 2 番目の列、$NF は最後の列です。

したがって、標準のNCSA結合の場合、ユーザーエージェントは列$13から列$NFまでです。

最初の列を削除し、変更されたログ形式の最後の列と交換する必要がありました (プロキシされた IP が最後の列に追加されました)。

したがって、返されるのは$NF列、次に2番目の列($2)、そして残りの列からNF - 1までです。

私は次のようにしてそれを行うことができました:-

awk '{ printf "%s ", $NF; for (i=2; i<=NF-1; i++) printf "%s ", $i; printf "\n";}' < /var/log/nginx/access.log

関連情報