linux 分割字符串_linux日志关键字检索&处理

最近开始用kpt记录自己的日常工作,本文将是该系列的第一篇,主要讲解linux下如何快速逻辑处理数据

Keep

正在做日志筛选数据的事情,需要从服务日志中捞出含关键字的日志,并且该条日志中含响应时间数据,需捞出其中大于500ms的数据

Problem

普通的grep只能捞出所有包含关键字的日志,没法做一些简单的逻辑判断,如果用编程语言来处理又会显得很笨重

Try

linux下有一个利器命令awk可以使用;

对于test.log日志内容类似如下的:

2019-05-03 20:00:00 requestId:a1 bb cc dd 4652019-05-03 20:00:01 requestId:aa bb cc kkk2019-05-03 20:00:01 requestId:a2 bb cc dd 5022019-05-03 20:00:01 requestId:a3 bb cc dd 600

上述内容中数字表示响应时间,如果需要打印响应时间大于500的requestId的值,基于awk该怎么写:

cat test.log |grep dd|awk '$7>500 {print $3}'

接下来让我们带着疑问来学习入门下awk命令:

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'# 这是awk的标准格式,BEGIN和END是可选的# 1、通过关键字 BEGIN 执行 BEGIN 块的内容,即 BEGIN 后花括号 {} 的内容。# 2、完成 BEGIN 块的执行,开始执行body块。# 3、读入有  换行符分割的记录。# 4、将记录按指定的域分隔符划分域,填充域,$0 则表示所有域(即一行内容),$1 表示第一个域,$n 表示第 n 个域。# 5、依次执行各 BODY 块,pattern 部分匹配该行内容成功后,才会执行 awk-commands 的内容。# 6、循环读取并执行各行直到文件结束,完成body块执行。# 7、开始 END 块执行,END 块可以输出最终结果。
2fafcf9e643cf4f9f5b7b9e5803e6fdd.png

重新来分析下上面写awk命令

cat test.log |grep dd|awk '$7>500 {print $3}'# 先通过grep获取到所有包含dd的内容# 接下来使用awk命令,这里直接用body模块,处理每一行数据# awk默认的分割符刚好是空格,所以我们直接用$7可以直接拿到响应时间# 判断完后简单多了,我们直接$3拿到每一个requestId# 如果吹毛求疵下,只想拿到对应的requestId的值该怎么写?cat test.log |grep dd|awk '$7>500 {print $3}'|awk -F:'{print $2}'# 我们在上述命令基础上再加上管道符,并利用-F来指定新的分隔符:,刚好将requestId:a1这样的字符串切割成两个# 然后直接print $2即可

一些awk的高级用法

正则匹配:

cat test.log |awk '/dd/ && $7>500 {print $3}'|awk -F: '{print $2}'# awk命令支持正则匹配,所以上述解决方案中,其实不需要grep命令,直接按照上述编写即可,&&表示并且

if函数:

cat test.log |awk '/dd/ {if($7>500)print $3}'|awk -F: '{print $2}'# awk自带if函数,上述解决方案我们还可以这样编写。将if函数放到body的{}中

BEGIN的用法:

cbc2077da19f8579d85dee88deae4f10.png

END的用法

cat test.log |awk 'BEGIN {print "im begin"} /dd/&&$7>500 {num=num+1;total=total+$7} END {print num;print total}'# awk支持自定义变量,上述命令是统计响应时间大于500的日志记录数,以及累计响应时长# 我们也可以先在BGGIN模块初始化自定义变量cat test.log |awk 'BEGIN {print "im begin";num=0;total=0} /dd/&&$7>500 {num=num+1;total=total+$7} END {print num;print total}'

参考资料:

https://www.runoob.com/linux/linux-comm-awk.html

https://coolshell.cn/articles/9070.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值