分解大型日志文件

分解大型日志文件

我正在尝试根据日期将大型日志文件分解为较小的文件。

该文件采用以下形式,其中某些行可能没有日期。这些行应包含在上一个日期行中。

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

我发现如何提取两个时间戳之间的日志这与我想要的很接近,只是我的日志文件在日期开始处不包含“[”,或在日期结尾处包含“]”。

该链接的命令是:

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,因此以日期开头的行上的整个日期,这就是-FT意思)是一组由 分隔的 3 个数字-。如果是,为了获取年份,我们提取前 4 个字符 ( d=substr($1,1,4)),为了获取月份,我们拆分第一个字段-,将结果字符串保存在数组d( split($1,d,"-")) 中,并使用数组的前两个元素( d[1]d[2]) 为文件名。

相关内容