大容量ログファイルの分割

大容量ログファイルの分割

日付に基づいて大きなログファイルをより小さなファイルに分割しようとしています。

ファイルは次の形式であり、一部の行に日付がない可能性があります。これらの行は前の日付行に含める必要があります。

2014-04-07T23:59:58 CheckForCallAction [ERROR] Exception caught
Undated line 1
Undated line 2
2014-04-08T00:00:03 MobileAppRequestFilter [DEBUG] Action
undated line 3
2015-04-08T00:00:03 MobileAppRequestFilter [DEBUG] ActionB

私が見つけた2つのタイムスタンプ間のログを抽出する方法私のログファイルに日付の先頭に「[」が含まれていないか、日付の最後に「]」が含まれていないことを除いて、これは私が望むものに近いものです。

このリンクのコマンドは次のとおりです。

awk -F'[[]|[]]' \
  '$0 ~ /^\[/ && $2 >= "2014-04-07 23:00" { p=1 }
   $0 ~ /^\[/ && $2 >= "2014-04-08 02:00" { p=0 }
   p { print $0 }' > test1.log  logwith[.log

数日間修正しようとしましたが、理解できないようです。

必要な改善点は、開始日と終了日を指定する必要はなく、出力ファイルの名前を年または月ごとに自動的に指定することです。

ベストアンサー1

フィールド区切り文字として使用され、T日付に似た属性を明示的に検証する文字列。たとえば、年ごとに分割すると、次のようになります。

awk -FT '($1~/^[0-9]+-[0-9]+-[0-9]+$/){d=substr($1,1,4)}{print > d".log"}' logfile 

年+月別:

awk -FT '($1~/^[0-9]+-[0-9]+-[0-9]+$/){split($1,d,"-")}{print > d[1]d[2]".log"}' logfile 

ここでは、最初のフィールド(で定義されているT、つまりdateで始まる行の完全な日付、つまりこれが-FT意味する)が区切りの3つの数値セットであることを確認します-。その場合は、年を取得するには最初の4文字(d=substr($1,1,4))を抽出し、月を取得するには最初のフィールドを分割し、結果の-文字列を配列dsplit($1,d,"-"))に保存し、配列の最初の2つの要素(d[1]d[2])をファイル名として使用します。

おすすめ記事