解析系统日志日期格式的简单方法

解析系统日志日期格式的简单方法

我想编写一个脚本来分析上周的系统日志。

但我的系统日志以愚蠢的日期格式记录,例如“5 月 22 日”。如果它记录为 2013-05-22,则此任务将是微不足道的。

有没有一种方法使用 awk / bash / perl / sed 可以轻松地“grep”两个日期时间之间所有行的日志?

答案1

这对我来说有点过于迂回,但您可能会感兴趣:

perl -p -e '
BEGIN{ 
        @months=qw(jan feb mar apr may jun jul aug sep oct nov dec);
        $month_number{$_}=++$i for @months;
        $months_regex= join "|",@months;
     }
s/^\s*($months_regex)[a-z]*\s+/$month_number{lc $1}-/i'
/var/log/syslog

这将打印(到标准输出)带有 MM-DD 格式的日期的日志行(月份数字没有零填充),您似乎可以轻松解析。这会处理以完整形式给出的月份名称和以 3 个字母形式给出的月份名称,无论大小写。


编辑

如果您想要月份数字零填充,只需替换++$isprintf "%02d",++$i

编辑2 修正了两个错误,感谢l0b0的评论如下:

  • 将“五月”添加到月份列表中
  • 将零填充的配方更改为sprintf "%02d", ++$i

答案2

这是我在 Perl 中的做法,尽管我更喜欢其他一些答案!

use DateTime::Format::Strptime;
my $parser = DateTime::Format::Strptime->new( pattern => '%B %d %Y');
m/^(\w+ \d+)/;
print $parser->parse_datetime("$1 " . DateTime->now->year)->ymd;

答案3

这样可以吗?

每行持有日期 > 10 日且 < 18 日:

awk '$2 > 10 && $2 < 18 {print}' file

包括月份名称:

awk '$1 == "May" && $2 > 10 && $2 < 18 {print}' file

跨度月份,4月27日至5月4日:

awk '($1 == "Apr" && $2 > 26) || ($1 == "May" && $2 < 5){print}' file

更新:

使用 getline 的粗略变体:

awk '"date '+%m%d' -d " $1$2 | getline date; close("date"); \
date > 426 && date < 505 {print}' file

使用脚本:

awk -v from=520 -v to=523 '
{
    d = ((match("JanFebMarAprMayJunJulAugSepOctNovDec", $1) + 2) / 3 )$2;
    if (d >= from && d <= to)
        print;

}
' file

使用开关:

awk -v from=520 -v to=523 '
function date2time()
{
    switch ($1) {
    case "Jan": return 1$2; break;
    case "Feb": return 2$2; break;
    case "Mar": return 3$2; break;
    case "Apr": return 4$2; break;
    case "May": return 5$2; break;
    case "Jun": return 6$2; break;
    case "Jul": return 7$2; break;
    case "Aug": return 8$2; break;
    case "Sep": return 9$2; break;
    case "Oct": return 10$2; break;
    case "Nov": return 11$2; break;
    case "Dec": return 12$2; break;
    }
}
{
    d = date2time();
    if (d >= from && d <= to)
        print;

}
' file

使用数组:

... oh see you have gotten your answer ;)

相关内容