当前位置: 技术问答>linux和unix
写shell脚本获取指定内容的日志信息??
来源: 互联网 发布时间:2016-08-30
本文导语: 有如下日志信息: ====log===== ..... (0)aa=+s000/(1)bb=xxxx/xh=1/xl=2/xj=3/(2)cc=1111/(3)dd=+r111/(4)ee="mmmm1"/ff="wz-a1"/ (0)aa=+s111/(3)bb=yyyy/xh=1/xl=2/xj=3/(4)cc=1112/(5)dd=+r444/(6)ee="mmll1"/ff="ww-a2"/ (0)aa=+s000/(2)bb=xzzz/xh=1/xl=2/xj=3/(4)cc=1113/(5)dd=+r111/(4)ee=...
有如下日志信息:
====log=====
.....
(0)aa=+s000/(1)bb=xxxx/xh=1/xl=2/xj=3/(2)cc=1111/(3)dd=+r111/(4)ee="mmmm1"/ff="wz-a1"/
(0)aa=+s111/(3)bb=yyyy/xh=1/xl=2/xj=3/(4)cc=1112/(5)dd=+r444/(6)ee="mmll1"/ff="ww-a2"/
(0)aa=+s000/(2)bb=xzzz/xh=1/xl=2/xj=3/(4)cc=1113/(5)dd=+r111/(4)ee="mmii1"/ff="wz-a2"/
(0)aa=+s222/(1)bb=xxzz/xh=1/xl=2/(2)cc=1114/(3)dd=+r333/(4)ee="mmjj1"/ff="wz-a11"/
(0)aa=+s222/(1)bb=xzzzx/xh=1/xl=2/xj=3/(2)cc=1115/(3)dd=+r333/(4)ee="mmnn1"/ff="wz-a33"/
(0)aa=+s000/(1)bb=xxyy/xh=1/xl=2/xj=3/(2)cc=1116/(3)dd=+r111/(4)ee="mmoo1"/ff="wz-a3"/
(0)aa=+s211/(1)bb=xxoo/xh=1/xl=2/(2)cc=1117/(3)dd=+r222/(4)ee="mmzz1"/ff="ww-a22"/
......
通过编写shell脚本获得aa=,dd=字段的值相同,ff=字段包含"wz"的行,列出这些行cc字段的值,并计算各自的数目。
如例中日志的输出应该是:
(0)aa=+s000/(1)bb=xxxx/xh=1/xl=2/xj=3/(2)cc=1111/(3)dd=+r111/(4)ee="mmmm1"/ff="wz-a1"/
(0)aa=+s000/(2)bb=xzzz/xh=1/xl=2/xj=3/(4)cc=1113/(5)dd=+r111/(4)ee="mmii1"/ff="wz-a2"/
(0)aa=+s000/(1)bb=xxyy/xh=1/xl=2/xj=3/(2)cc=1116/(3)dd=+r111/(4)ee="mmoo1"/ff="wz-a3"/
(0)aa=+s222/(1)bb=xxzz/xh=1/xl=2/(2)cc=1114/(3)dd=+r333/(4)ee="mmjj1"/ff="wz-a11"/
(0)aa=+s222/(1)bb=xzzzx/xh=1/xl=2/xj=3/(2)cc=1115/(3)dd=+r333/(4)ee="mmnn1"/ff="wz-a33"/
3,cc=1111,cc=1113,cc=1116
2,cc=1114,cc=1115
这样的shell脚本应该怎样写?同时由于数据量大,还要注意执行效率。
P.S.>由于这是一段日志信息,所以得出相同的值绝对不会是固定的,类似grep aa=+s000 log的命令实现是不能达到效果的,意思就是grep ... log 中...的值必为变量。
====log=====
.....
(0)aa=+s000/(1)bb=xxxx/xh=1/xl=2/xj=3/(2)cc=1111/(3)dd=+r111/(4)ee="mmmm1"/ff="wz-a1"/
(0)aa=+s111/(3)bb=yyyy/xh=1/xl=2/xj=3/(4)cc=1112/(5)dd=+r444/(6)ee="mmll1"/ff="ww-a2"/
(0)aa=+s000/(2)bb=xzzz/xh=1/xl=2/xj=3/(4)cc=1113/(5)dd=+r111/(4)ee="mmii1"/ff="wz-a2"/
(0)aa=+s222/(1)bb=xxzz/xh=1/xl=2/(2)cc=1114/(3)dd=+r333/(4)ee="mmjj1"/ff="wz-a11"/
(0)aa=+s222/(1)bb=xzzzx/xh=1/xl=2/xj=3/(2)cc=1115/(3)dd=+r333/(4)ee="mmnn1"/ff="wz-a33"/
(0)aa=+s000/(1)bb=xxyy/xh=1/xl=2/xj=3/(2)cc=1116/(3)dd=+r111/(4)ee="mmoo1"/ff="wz-a3"/
(0)aa=+s211/(1)bb=xxoo/xh=1/xl=2/(2)cc=1117/(3)dd=+r222/(4)ee="mmzz1"/ff="ww-a22"/
......
通过编写shell脚本获得aa=,dd=字段的值相同,ff=字段包含"wz"的行,列出这些行cc字段的值,并计算各自的数目。
如例中日志的输出应该是:
(0)aa=+s000/(1)bb=xxxx/xh=1/xl=2/xj=3/(2)cc=1111/(3)dd=+r111/(4)ee="mmmm1"/ff="wz-a1"/
(0)aa=+s000/(2)bb=xzzz/xh=1/xl=2/xj=3/(4)cc=1113/(5)dd=+r111/(4)ee="mmii1"/ff="wz-a2"/
(0)aa=+s000/(1)bb=xxyy/xh=1/xl=2/xj=3/(2)cc=1116/(3)dd=+r111/(4)ee="mmoo1"/ff="wz-a3"/
(0)aa=+s222/(1)bb=xxzz/xh=1/xl=2/(2)cc=1114/(3)dd=+r333/(4)ee="mmjj1"/ff="wz-a11"/
(0)aa=+s222/(1)bb=xzzzx/xh=1/xl=2/xj=3/(2)cc=1115/(3)dd=+r333/(4)ee="mmnn1"/ff="wz-a33"/
3,cc=1111,cc=1113,cc=1116
2,cc=1114,cc=1115
这样的shell脚本应该怎样写?同时由于数据量大,还要注意执行效率。
P.S.>由于这是一段日志信息,所以得出相同的值绝对不会是固定的,类似grep aa=+s000 log的命令实现是不能达到效果的,意思就是grep ... log 中...的值必为变量。
|
cat log | awk -F'[=]|[/]' '{if($1==$14 && $18 ~ /wz/) print $12}' | awk '{a[$1]++}END{for(i in a) print i,a[i]}'