bash - 如何在 gawk 中将日期字符串转换为时间戳?

标签 bash awk gawk

我正在扫描格式如下的日志文件:

76.69.120.244 - - [09/Jun/2015:17:13:18 -0700] "GET /file.jpg HTTP/1.1" 200 22977 "http://example.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36" "16543" "ewr1" "0.002" "CA" "Bell Canada" "2"
76.69.120.244 - - [09/Jun/2015:17:13:19 -0700] "GET /differentfile.bin HTTP/1.1" 206 453684 "http://example.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36" "16543" "ewr1" "1.067" "CA" "Bell Canada" "2"

在 gawk 内部,我使用以下方法获取请求时间:

requesttime=$4;

将其解析为基于 UTC/GMT 的时间(最好是纪元时间戳)的最佳方法是什么?

如果有帮助的话,我至少可以保证它会在-0700;也许某种丑陋的字符串转换来添加这 7 个小时?

最佳答案

这将完成将日期+时间(它忽略 -0700)转换为自当前区域设置纪元以来的秒数的主要部分:

$ cat tst.awk
BEGIN { FS="[][]" }
{
    split($2,a,"[/: ]")
    match("JanFebMarAprMayJunJulAugSepOctNovDec",a[2])
    a[2] = sprintf("%02d",(RSTART+2)/3)
    secs = mktime(a[3]" "a[2]" "a[1]" "a[4]" "a[5]" "a[6])
    print $2, "->", secs
}

$ awk -f tst.awk file
09/Jun/2015:17:13:18 -0700 -> 1433887998
09/Jun/2015:17:13:19 -0700 -> 1433887999

然后您可以在调用 awk 之前对秒进行一些数学计算或适当设置 TZ 变量,例如(不知道这是否是用于您的数据/区域设置的正确 TZ):

$ TZ=UTC awk -f tst.awk file
09/Jun/2015:17:13:18 -0700 -> 1433869998
09/Jun/2015:17:13:19 -0700 -> 1433869999

您可以使用 strftime("%z") 获取当前区域设置时区偏移量:

$ awk 'BEGIN{print strftime("%z")}'
-0500

因此,包含偏移计算的最终解决方案可能是或包括(检查数学,因为您没有显示预期的输出是什么,我可能会误解您的数据对您意味着什么!):

$ cat tst.awk
BEGIN {
    FS="[][]"
    locOffset = strftime("%z")
}
{
    split($2,a,"[/: ]")
    match("JanFebMarAprMayJunJulAugSepOctNovDec",a[2])
    a[2] = sprintf("%02d",(RSTART+2)/3)
    secs = mktime(a[3]" "a[2]" "a[1]" "a[4]" "a[5]" "a[6])
    secs = secs + (locOffset - a[7]) * 60 * 60
    print $2, "->", secs
}

$ awk -f tst.awk file
09/Jun/2015:17:13:18 -0700 -> 1434607998
09/Jun/2015:17:13:19 -0700 -> 1434607999

或者如果您喜欢简洁和谜题 (;-)):

$ cat tst.awk
BEGIN { FS="[][]" }
{
    split($2,a,"[/: ]")
    print $2, "->", mktime(a[3]" "(match("JanFebMarAprMayJunJulAugSepOctNovDec",a[2])+2)/3" "a[1]" "a[4]" "a[5]" "a[6]) + (strftime("%z") - a[7])*60*60
}

$ awk -f tst.awk file
09/Jun/2015:17:13:18 -0700 -> 1434607998
09/Jun/2015:17:13:19 -0700 -> 1434607999

关于bash - 如何在 gawk 中将日期字符串转换为时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31054060/

相关文章:

bash - 搜索复制的作业

linux - 使用 awk 在 bash 函数中使用命令输出变量时出错

linux - 如何在linux shell脚本中获取预期的字符串

linux - 将文件的一列与另一个文件匹配,并使用 bash 替换不同的列

awk - 如何在不同字段中以不同的颜色打印awk的结果?

bash - awk 或其他命令如何获取字符串 curl 结果的变量值?

linux - 如何使用 seq 填充小数位

arrays - 动态填充多维 awk 数组

csv - 使用 awk 按名称获取 CSV 字段

Bash:路径为\