java调用awk解析日志_日志分析命令awk基础用法

本文介绍了awk作为文本处理工具的基础用法,特别是在日志分析中的应用。awk通过读取文本行并按字段处理,支持条件判断和格式化输出。文章通过实例展示了如何选取特定列、更改字段分隔符、设置输出分隔符以及处理特殊行分隔符的情况。此外,还提到了awk在处理波次号和播种墙号场景的应用。
摘要由CSDN通过智能技术生成

awk

awk是一个很好用的文本处理工具,相对于sed常用用作一整行的处理,awk则比较擅长将一行分成数个字段来处理。而在我们性能测试中,可以awk可以帮助我们造数,也可以帮助我们分析日志。

简单来说,awk就是用一个循环实现的。首先awk读取文本的一行(默认是从第一行开始,淡然也可以根据条件选择行),然后根据你给的条件来处理这行的某个字段;处理完成后,再读取下一行,然后再根据条件去处理字段,直到处理完成所有的行。

awk的标准格式

awk '条件类型1{动作1} 条件类型2{动作2}.......'

awk常用的内置变量

NR:现在处理的是第几行数据

NF:每行一共的字段数      可以用来取倒数第一列,第二列,例如:awk  '{print   $(NF-1),$NF }'   test01.txt     $NF 代表最后一列,$(NF-1)代表倒数第二列

$0:代表一整行数据

$1:代表第一个字段,以此类推

RS 输入行分隔符(默认为回车)

ORS 输出行分隔符(默认为回车)

FS 字段分隔符(默认为空格)

-F  指定多个字段分隔符并且支持正则表达式(比FS更加强大一些)

OFS 输出字段分隔符(默认为空格)

格式化输出

print函数

特性

参数可以是变量、计算值、或字符串常量

字符串必须用双引号括起来

参数之间用逗号分隔(输出分隔符由变量OFS决定)

输出可以被重定向

输出和输入之间可以通过管道

printf函数

特性

返回给标准输出一个带有格式的字符串

不会在行尾自动换行

包含一个加引号的字符串

修饰符

“-”        左对齐

#         八进制加0 十六进制加0x

+         加上正负号+或-

0         用0填充空白符

条件语句

格式:{if{(expression){

statement; statement;….

}

else if(expression){

statement; statement;….

}

else{ statement; statement;….

}

}

可以使用条件,对字段进行处理

实战演练

例1

如下文本我只想要第一列和第三列然后重定向到test001.txt中

981973bf13345baa4bf220734908a72a.png

awk '{print $1,$3}' example.txt >test001.txt

4c3e243123d03119ef0afee39705e8b2.png

例2

如果字段的分隔符不是空格,那么我们需要先提前指定分隔符,使用-F或者FS,以passwd文件为例,每个字段是以冒号分隔的,我们想取出第二个字段,和第七个字段

2ca80ff6a5e2767f357e1cb057f9baae.png

awk -F':' '{print $2,$7}' /etc/passwd

22f2d66101c54c5a1b95fd63f6d76afe.png

例3

默认出输出字段分隔符是空格,如果想改变默认输出分隔符呢,比如改成|

文本test001,原来的内容

e19a05a0dc1a6d75218c6f2dbcdc642c.png

awk '{OFS="|"}{print $1,$2}' test001.txt

89b3f6b2ad7c53b559e905776f4adaf2.png

例4

默认输出行分隔符是回车,如果想把分隔符改成|呢,

文本test001,原来的内容,默认行分隔符为回车

501c8dc885496eaef7c730400aa3c95a.png

例5

如果要处理的文本,默认不是以回车作为行的分隔符,我们希望处理之后,以回车作为空格符

要处理的文本,以”_”作为行的分隔符,我们想以回车为分隔符

680ee5042399ee7efa4fc7f6fb175a3a.png

awk 'BEGIN{RS="_"}{print $0}' test003.txt

d186b781e11f9db96f6e79a6db381a33.png

例6

业务要求,一个播种墙号,对应一个波次号,播种墙号不能重复。文件中已有波次号(第二列),是重复的,但是每个号重复的数量不确定;需要自己添加播种墙号,播种墙号是连续的

4e42401b47d184d9c322d8cc3945aafc.png

思路:使用awk进行处理,先读取第一行的播次号,把他赋值给一个变量,然后拿每行的波次号和这个变量相比较,如果相等,则播种墙号不变,如果不等,则播种墙号+1

由于语句较长,因此,写成shell脚本

a8207081ba422b7ee3d56655fc7bf14e.png

#$1的值赋值给qiang这个变量(这里的$1、$2指的是shell的参数,不是awk里面的)

#$2的值赋值给boci这个变量

#进行判断,如果$2(即文件里波次号)的值等于变量boci的值,那么输出原始文件整行和播种墙号

#如果$2(即文件里波次号)的值不等于变量boci的值,播种墙号+1,然后输出输出原始文件整行和播种墙号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值