日付に基づいて大容量ログファイルを複数の部分に分割する

日付に基づいて大容量ログファイルを複数の部分に分割する

日付に基づいて大量のログファイルを複数の部分に分割するLinuxコマンドを作成しようとしています。

使用既存のApacheログファイルを毎月分割する方法は?出発点として以下を試しました。

awk '{ split($4,array,"/"); print > array[2] ".txt" }' TestLog.txt

私の例TestLog.txt(さまざまな年の5月、6月、7月の項目を含む)では、May.txt、Jun.txt、およびJul.txtというテキストファイルが生成されます。

配列の値を理解するために、出力ファイルを削除し、次のように配列値を表示しました。

awk '{ split($4,array,"/"); print  array[1] "  "  array[2] "  " array[3] "  " array[4] }' TestLog.txt

TestLog.txtの最初の2行は次のとおりです。

124.115.5.11 - - [30/May/2011:23:21:37 -0500] "GET / HTTP/1.0" 200 206492 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322;TencentTraveler)"
58.61.164.39 - - [31/May/2011:00:36:35 -0500] "GET / HTTP/1.0" 200 206492 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322;TencentTraveler)"

これにより、[30 May 2011:23:21:37 ファイルの最初の行が生成されます。

結果は私を非常に混乱させた。特に:

  1. なぜarray[1]同じで[30ないのです124.115.5.11 - - [30か?

  2. なぜarray[3]同じで2011:23:21:37ないのです2011:00:36:35 -0500] "GETか?

  3. なぜ空ですかarray[4]

  4. の価値はいくらになるべきですかarray[0]

答え1

最初の行を見てみましょう。

124.115.5.11 - - [30/May/2011:23:21:37 -0500] "GET / HTTP/1.0" 200 206492 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322;TencentTraveler)"

このスニペットの重要な部分は次のとおりですawk

awk '{ split($4,array,"/") ...

何が起こるかは次のとおりです。

  • awkスペースで行を実行して分割する(デフォルトフィールド区切り記号)
  • 4仕事この行のフィールドも/文字に基づいて分割されます。
  • 分割結果はarray
  • array[2]その後、行全体が4番目のフィールドの2番目のサブフィールドと呼ばれるファイルに印刷されます()。

so$4フィールドには最初にが含まれて[30/May/2011:23:21:37おり、分割後

array[1]=[30
array[2]=May
array[3]=2011:23:21:37

いいえarray[4](最初の4フィールドに最初の「サブフィールド」が含まれていないため4)、いいえ(配列インデックスが1から始まるarray[0]ため)。awk

関連情報