如何使用awk命令将GMT转换为IST

时间:2015-08-04 08:08:06

标签: bash awk

在nginx access.log中,我们在GMT时区中有时间格式。使用awk命令,将日志转换为csv文件。

awk '{print $4","$7,"$10","$15","$16","$17}' </usr/local/nginx/logs/access.log>access.csv

$ 4 - 以格林威治标准时间显示日期(2015年7月31日:16:03:07)。

请指导如何将其更改为IST并在该csv文件中更新。

1 个答案:

答案 0 :(得分:0)

如果您可以访问GNU awk和GNU日期,you could use TZ可以轻松获得IST时间:

$ TZ='Asia/Kolkata' date -d "@1438374787"

&#39; 1438374787&#39; value是GMT中自纪元以来的秒数,也称为systime。

要使systime超出日期,我们可以使用(GNU)awk中的mktime

直接在awk中将GMT字符串转换为纪元时间:

$ echo "a test date 31/07/2015:16:33:07" | awk '{gsub("[/:]"," ",$4); $0=$0;t=sprintf("%d %d %d %d %d %d 0",$6,$5,$4,$7,$8,$9);print(mktime(t))}'

为了实现这一点,你需要所有值都是数字(没有jul,对不起)。如果无法做到这一点,您需要为命令日期可以正确读取的字符串计算格式(有时不是一件容易的事)。

将所有内容放在一个脚本中:

#!/bin/bash --
echo "a test date 31/07/2015:16:33:07" | awk '{
    split($4,A,"[:/]");
    gmtdate=sprintf("%d %d %d %d %d %d",A[3],A[2],A[1],A[4],A[5],A[6]);
    print gmtdate;
    T1=mktime(gmtdate);
    print T1;
    pt = sprintf ("TZ=%s%s%s date -d %s%s%s%s","\047","Asia/Kolkata","\047","\042","@",T1,"\042");
    print pt;
    system(pt);
}'

然后,运行它:

$ ./stackoverflow-awk-time-test.sh
2015 7 31 16 33 7
1438374787
TZ='Asia/Kolkata' date -d "@1438374787"
Sat Aug  1 02:03:07 IST 2015

从awk打印了几个额外的调试值(易于删除)。

相关问题