【问题标题】:Convert apache log date format to epoch in bash在bash中将apache日志日期格式转换为纪元
【发布时间】:2023-03-31 12:26:01
【问题描述】:

我的目标是将格式为 "12/Nov/2015:23:28:22" 的 apache 日志中的日期转换为纪元格式。这可以使用 date 命令完成还是我需要解析和提取信息?

【问题讨论】:

  • 这是一种相当奇怪的日期时间格式,我尝试过的date 都无法解析它,虽然在 CentOS 7 上都没有,但一个是 GNU 日期,这是我想象 CentOS 使用的。
  • 我同意。虽然这是我的 apache 日志的格式。我有点惊讶 date 没有办法提供自定义格式 date +"%d/%b/%Y:%H:%M:%S" -s "12/Nov/2015 :23:28:22"
  • 是的,我知道必须用一种奇怪的格式解析日志,你会被困在其中。 :-) 我同意,date 允许您指定输出格式,如果您也可以指定输入格式就好了。 @EricRenouf 在下面提供了一个很好的解决方案,不过可以将日期转换为 date 可以理解的格式。

标签: linux bash shell centos7


【解决方案1】:

似乎我的date 命令希望在日期部分之间使用- 而不是/,并且用空格与时间部分隔开。所以我用sed 来做这样的转换:

date -d "$(echo '12/Nov/2015:23:28:22' | sed -e 's,/,-,g' -e 's,:, ,')" +"%s"

【讨论】:

    【解决方案2】:

    你可以使用包dateutils:

    dateutils.strptime -i "%Y%m%dT%H%M%S" -f "%d.%m.%Y %H:%M:%S" "20170411T172238"

    -i 是您的输入格式,-f 是输出格式

    【讨论】:

      【解决方案3】:

      虽然 @Matthias Leuffen 的 https://stackoverflow.com/a/43351684/308851 很有希望(它的输入和输出格式错误,但 w/e),但对我来说,dateutils.strptime-S 选项根本不起作用,它没有发出日志的其余部分只是打印了一堆时间戳,一个接一个,无穷无尽的数字流,所以我寻找另一个解决方案。

      https://groups.google.com/d/msg/comp.lang.awk/FXrz0VIvz4A/hhjQuu9gx3YJstrptime 支持添加到awk(更准确地说是gawk 4)。所以你可以用https://serverfault.com/a/253232/64874把你的日志改成#分隔然后

      awk -l ./strptime.so -F'#' '{print strftime("%s", strptime($1, "%d/%b/%Y:%H:%M:%S %Z")) "#" $2 "#" $3}'

      根据您的需要更改$1 $2 $3

      【讨论】:

        猜你喜欢
        • 2011-10-04
        • 2015-01-23
        • 2012-12-17
        • 1970-01-01
        • 2018-05-16
        • 2017-08-09
        • 1970-01-01
        • 2021-12-29
        • 1970-01-01
        相关资源
        最近更新 更多