linux - 使用命令行转换 Apache 日志日期时间格式

标签 linux apache datetime

我有这样一行来提取 apache 日志每小时的日期时间

awk '{print $4}' elasticsearch.log.* | cut -c2-15 | sed -e 's/$/:00:00/

问题是输出日期的格式如下

07/Jul/2014:06:00:00

有没有一种方法可以使用命令行将日期时间格式即时转换为更常见的格式,如“YYYY-MM-DD HH:mm:ss”,例如2014-07-07 06:00:00 ?

我现在找到的一种方法是使用中间脚本

#!/usr/bin/env python

import sys
import re


months = {'Jan': '01', 'Feb': '02', 'Mar': '03', 'Apr': '04', 'May': '05', 'Jun': '06', 'Jul': '07', 'Aug': '08', 'Sep': '09', 'Oct': '10', 'Nov': '11', 'Dec' : '12'}
regex = re.compile("(\d{2})/(\w+)/(\d{4}):(\d{2}):(\d{2}):(\d{2})",re.IGNORECASE)
for line in sys.stdin:
    try:
        r = regex.search(line)
        g = r.groups()
        print g[2] + '-' + months[g[1]] + '-' + g[0] + ' ' + g[3] + ':' + g[4] + ':' + g[5]
    except:
        pass

但我正在寻找是否有更短的方法

最佳答案

也许 date(至少是 GNU coreutils 的)在这里可以提供帮助。它可以识别许多不同的日期格式,但在您的情况下,必须先将斜杠 tr 转换为空格。

$ echo '07/Jul/2014 06:00:00\n09/Aug/2015 07:01:02' |
> tr '/' ' ' | date -f - +%Y-%m-%d\ %H:%M:%S
2014-07-07 06:00:00
2015-08-09 07:01:02

糟糕,我以为您示例中的第一个冒号是错字,应该是一个空格。你的正则表达式表明我错了。在那种情况下你可以这样做:

$ echo '07/Jul/2014:06:00:00\n09/Aug/2015:07:01:02' |
> sed -e 's/\// /g;s/:/ /1' | date -f - +%Y-%m-%d\ %H:%M:%S
2014-07-07 06:00:00
2015-08-09 07:01:02

希望这对您有所帮助。

关于linux - 使用命令行转换 Apache 日志日期时间格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24608951/

相关文章:

linux - 将非标准字符写入 Linux 命令行

python - Centos 6 : scrapy commend not found(installed successfully)

php - 如何有条件地在 .htaccess 中或通过其他方式为特定请求设置 php ini 值

apache - 您自己服务器上的动态 DNS

python - 使用 pd.to_datetime 处理多种日期时间格式

python - 如何使用 GAE/Python 设置 cookie 1 个月?

c - 在原始套接字中禁用网桥转发

PHP 如何打开浏览器错误日志记录

php - 在 xampp localhost 中使用 PHP 和 htaccess 创建动态子域

python - 如何在 SPSS 中将周名称变量创建为等于一周第一天的字符串(例如星期日的日期)