Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1091586
  • 博文数量: 186
  • 博客积分: 4939
  • 博客等级: 上校
  • 技术积分: 2075
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-08 17:15
文章分类

全部博文(186)

文章存档

2018年(1)

2017年(3)

2016年(11)

2015年(42)

2014年(21)

2013年(9)

2012年(18)

2011年(46)

2010年(35)

分类:

2011-09-19 17:14:52

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

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


  1. 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,打印出来。谢谢紫云飞的思路和代码。

  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是亮点噢.

阅读(4914) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~