Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3024253
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-09-18 14:16:56

文件名: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是亮点噢.

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

expert12012-02-26 09:24:57

good