Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1471463
  • 博文数量: 246
  • 博客积分: 3353
  • 博客等级: 中校
  • 技术积分: 3295
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-09 17:56
个人简介

精通测试技术,linux,shell,性能测试

文章分类

全部博文(246)

文章存档

2024年(3)

2023年(7)

2022年(7)

2021年(4)

2020年(1)

2019年(2)

2017年(2)

2016年(3)

2015年(11)

2014年(20)

2013年(10)

2012年(176)

分类: LINUX

2012-08-21 22:21:58

最近调试一个程序,debug的同时需要确定,系统日志第一次出现关键的时间,如果system很大,比如几百MB,脚本如果要反复用grep “关键字” system.log,计算的时间不准确,因此想到使用tail -f,但没想到,竟然匹配的关键字输出不到out文件,因此研究了一番

 

先看一下如下两个命令:
tail -f system.log | grep “thanks”   

  1. Administrator@2012-0521-2127 ~
  2. $ cat system.log
  3. thanks
  4. Administrator@2012-0521-2127 ~
  5. $ tail -f system.log | grep "thanks"
  6. thanks
如果我们不断的往 system.log中输入,结果是可以实时输出来的,如图:

第二条命令  
grep
thanks
system.log >> out
如果system.log有匹配内容,是可以把 system.log中的匹配内容输出到 out

第三条命令  把如下两个命令结合起来,文件system.log的匹配内容就无法输出到 out
tail -f system.log | grep “thanks” >> out  
由下图可见,out没有任何匹配文字输出,而system.log确实有匹配关键字,如图
    

out中什么也没有, 好像被阻塞了一样, 后来查了原因往文件中写 ,跟往终端上输出是不一样的,往文件中写,是先写到pipe的缓冲区中,然后再往文件中写,用了 tail -f 之后表示一个流还没有完成, 缓冲区不会自动写, 所以out中一直没有内容。
正确的写法是  tail -f system.log | awk '/thanks/{print;fflush()}' >> out

这样就完美的写出了对一个流式的 awk 的处理 并将处理的结果保存到一个文件中。
经过试验,不仅在执行

tail -f system.log | awk '/thanks/{print;fflush()}' >> out

的时候,如果此时system.log里有匹配关键字“thanks”,可以输出到out文件,如图:
 
如果继续向system.log,写入“thanks”,仍然可以输出到out文件,如图:
 
 
 
阅读(6593) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~