我正在尝试根据日期将大型日志文件分解为较小的文件。
该文件采用以下形式,其中某些行可能没有日期。这些行应包含在上一个日期行中。
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]
) 为文件名。