awk例子解释,引入环境变量

以下为网上一个帖子的需求


操作系统为aix,日志文件比较大,我想从一个日志文件中取出一个关键字的第一次出现和最后出现之间的信息,如下:

文件:1.log
abc abc abcabc
abc lzjabc abcabc
abcabc abc abcabc abclzj
abcabc abc
abcabcabc abc abc
abc lzj abc abc
abc
abc

----------------------------------------------------------------------------------------------------------------------

对   awk '/lzj/{print s$0;p=1;s="";next}p{s=s$0"\n\n\n"}' 1.log  的解释

1.  /lzj/ 正则表达式逐行匹配含有lzj的行,匹配到第一行的时候执行/lzj/后面第一个花括号的内容{{print s$0;p=1;s="";next};由于被匹配,执行结果是print s$0  此时s为新变量且为空,而且s和$0之间没有逗号,类似print$0$1效果,实际结果为print$0,在让p=1,p为真,再把s变量置空,next跳过p{s=s$0"\n\n\n"}' 代码段;

2,紧接着上面被匹配的下一行,如果仍然匹配,则如同1的执行效果,如果不匹配,及不包含lzj,/lzj/为假,/lzj/后第一个花括号/{print s$0;p=1;s="";next}不执行,但是执行p{s=s$0"\n\n\n"}' 没有print (这里类似PATH=/opt/software/bin:$PATH),由于p一直为真,一直持续到下一次/lzj/被匹配

3,承接上面,未被匹后的下一次匹配。首先print出s,这里的s为之前所有未被匹配的行,再print改匹配的行$0,即为print s$0的解释,然后置空s,后面next,跳过p之后的代码段,虽然p为真,s保存之后的为匹配的行,但是如果之后一直没有/lzj/,此后便不再执行print动作。

 

 

 

另外p的作用是控制第一次print,如果不控制后面{s=s$0"\n\n\n"}'段的执行条件,则会一直执行,因为就算为被匹配,但是未被匹配的行被s变量通过apend的方式追加,直到下一次遇到/lzj/,则会一次性把之前的s  print出来

 

引入环境变量

d=2018-09-03;kubectl logs mscshuta-6zf23 |awk  '/'$d'/{print $0}'

for i in `kubectl get pod | awk '{print $1}'|grep -v NAME`
do kubectl logs $i | awk '/^[\^]?'$(date -d "-1 day" +%F)' /{print s$0;p=1;s="";next}p{s=s$0"\n"}' > /root/logs/$(date -d "-1 day" +%F)-$i
done

 

posted @ 2018-08-31 10:07  Dothraki  阅读(512)  评论(0编辑  收藏  举报