
私は 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
- オプション
-e
1 行プログラム
私はグーグルで調べたパールを盗んで微調整しました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