我有两种类型的日志文件
标准系统日志格式
时间戳如下
5:2015 Dec 21 07:35:06:ABC:foo1:1559: common.c:946:Enabling filter
6:2015 Dec 21 07:35:08:ABC:bar1:1461: api.c:124:Trigger activated
6:2015 Dec 21 07:35:16:BMC:kernel:-:<6>drivers/usb1_1.c:598:Error processing request on endpoint 0
自定义日志格式
日期时间在文件的第一行中给出。接下来的几行相对于第一行。示例如下:
Timestamp H:M:S 15:4:1 D:M:Y 16:1:2015
Firmware Version: 121020150140
[04:01]------------[ Logs ]------------
[04:03]Device Data: -> Supported Attributes -> 0x8033B
[04:01]Device Cleanup
[04:19]SendClearMsg ...
[04:23]Param:GetData failed
[04:51]Current Update Count:7
[05:01]MODECHK:Normal mode
4:01的时间戳是4分钟,自15:4:1以来为1秒,应转换为15:08:2。
有什么建议可以实现这一目标吗?
此解决方案使用awk脚本将第一个文件中的日期转换为自该纪元以来的秒数,并将该数字前置到输出中。我们date +%s --date
经常做艰苦的工作,并secs
通过调用awk的getline
函数将命令的输出捕获到awk变量中。(awk语法为:command | getline
variable)。
awk <log1 >log1.new '
{ y = substr($0,3,4); m = $2; d = $3; hms = substr($0,15,8)
"date \"+%s\" --date \"" d " " m " " y " " hms "\"" | getline secs
print secs " " $0
}'
第二个awk脚本对第二个文件执行相同的操作,但仅对时间戳记的第一行执行此操作,该脚本保存在awk变量中base
。在其他行上,我们只需将分钟和秒的偏移量添加到该基准,并使用date
第一个文件的格式将自纪元以来的秒数转换为实际日期。
awk <log2 >log2.new '
/^Timestamp/{ split($5,x,":"); dmy = sprintf("%04d/%02d/%02d",x[3],x[2],x[1])
split($3,x,":"); hms = sprintf("%02d:%02d:%02d",x[1],x[2],x[3])
"date \"+%s\" --date \"" dmy " " hms "\"" | getline base
}
/^\[/ { mins = substr($0,2,2); secs = substr($0,5,2);
tot = base + mins*60+secs
"date \"+%Y %b %d %H:%M:%S\" --date @" tot | getline date
print tot " -:" date " " substr($0,8)
}'
然后,按编号字段上的排序将两个文件合并,最后用sed删除编号。
sort -m -n -k1,1 log1.new log2.new |
sed 's/^[^ ]* //'
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句