【发布时间】:2019-10-26 09:25:44
【问题描述】:
我有一个日志文件,我正在尝试使用 sed/awk/grep 重新格式化,但在日期格式方面遇到了困难。日志如下所示:
1.2.3.4 - - [28/Mar/2019:11:43:58 +0000] "GET /e9bb2dddd28b/5.6.7.8/YL0000000000.rom HTTP/1.1" "-" "Yealink W52P 25.81.0.10 00:00:00:00:00:00" 404 - 1 5 0.146
我想要这样的输出:
Yealink,1.2.3.4,28-03-2019 11:43:58
我尝试了以下方法:
grep Yealink access.log | grep 404 | sed 's/\[//g' | awk '{print "Yealink,",$1,",",strftime("%Y-%m-%d %H:%M:%S", $4)}' | sed 's/, /,/g' | sed 's/ ,/,/g'
编辑 - 在基于 cmets 将日期字符串传递给 strftime 之前删除 [ - 但仍无法按预期工作
但是这会返回一个空日期 - 很明显我的 strftime 语法错误:
Yealink,1.2.3.4,1970-01-01 01:00:00
【问题讨论】:
-
据我所知,您将字符串
[28/Mar/2019:11:43:58传递给strftime,而不是unix 纪元时间。您是要先解析它还是要另辟蹊径? -
我已经删除了
[,以便我以这种格式28/Mar/2019:12:05:11传递一次strftime,但结果仍然相同 - 已编辑上面的帖子以反映这一点 -
您可能需要以某种方式解析日期:
grep 'Yealink.*404' access.log | perl -MTime::Piece -l -n -e 'next unless /^(\S+)\s[^[]+\[([^]]+)\]/; my $date = Time::Piece->strptime($2, "%d/%b/%Y:%H:%M:%S %z")->strftime("%F %T"); print "Yealink,$1,$date";' -
@Score_Under 虽然我没想到会使用 Perl,但它仍然有效!感谢您解决这个问题。