在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文件中更新。
答案 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打印了几个额外的调试值(易于删除)。