日付に基づいて大量のログファイルを複数の部分に分割する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
ファイルの最初の行が生成されます。
結果は私を非常に混乱させた。特に:
なぜ
array[1]
同じで[30
ないのです124.115.5.11 - - [30
か?なぜ
array[3]
同じで2011:23:21:37
ないのです2011:00:36:35 -0500] "GET
か?なぜ空ですか
array[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