awk之ARGV,ARGIND,mktime(),strftime()

文件名:file_2011-09-13_17:00:07.log

a 100b 200c 300..假如文件总行数有上万行,在file_2011-09-13_17:00:07.log文件的每行前面插入文件名里的时间戳,并且每行加一秒,最后希望得到的文件内容为:2011-09-13 17:00:07 a 1002011-09-13 17:00:08 b 2002011-09-13 17:00:09 c 300..

    awk ‘BEGIN{now=mktime(gensub(“[-_:]”,” “,”g”,substr(ARGV[ARGIND+1],6,19)))}{print(strftime(“%F %T”,now++)” “$0)}’ file_2011-09-13_17:00:07.log

[解析]首先要获取文件名里的时间戳,然后转换成秒,因为这样才能实现时间的自加增长,再把秒数换算为时间戳,然后每行输出。这是解题的思路,这里我们在BEGIN里操作,首先要获得文件名,这里我们要了解ARGV这个函数,它是一个把所有的参数作为内容一个数组,下标从1开始代表第一个参数ARGV[1],这里我们用ARGIND+1来实现第一个参数也就是文件名,其实它的功能和FILENAME内建变量是一样的,只是BEGIN里还不会读取文件,所以FILENAME为空,才采用ARGV的办法来获取文件名。然后截取文件名的第6个字符开始长度为19的字符串,就是把”2011-09-13_17:00:07“来当作gensub替换的对象,然后把截取出来的字符串替换成”2011 09 13 17 00 07″格式,这样mktime()函数就把日期转换成了秒,跟我们shell命令的date -d “20110913 170007″ +%s 是一个原理,只是mktime是awk内部函数。获得秒数后,赋予给变量now,然后依次开始读取文本,通过strftime()函数又把秒转换成规定的时间戳格式然后每行加1,打印出来。谢谢紫云飞的思路和代码。

    awk ‘{s=gensub(/file_|\.log/,””,”g”,FILENAME);sub(“_”,” “,s);cmd1=”date -d \&;”s”\&; \&;+%s\&;”;cmd1|getline t;cmd2=”date -d @”t++” \&;+%F %T\&;”;cmd2|getline T;print T,$0}’ file

[解析]这个语句的思路也差不多是一样的,在FILENAME中替换出时间戳,然后再把”_”替换成空格,然后把系统的data命令赋值到一个变量,通过getline把该命令行的执行结果读取给变量t,再把t++的命令读取给变量T,最后打印.getline是亮点噢.

awk之ARGV,ARGIND,mktime(),strftime()

相关文章:

你感兴趣的文章:

标签云: