awk中的字符串处理函数

背景:使用awk从日志中解析出对应的字段;
日志格式如下所示,需要解析出ip、date、url以及action取值;其中action的位置不固定,不一定是作为第一个参数出现
10.10.10.10 - - [31/Jul/2013:03:30:44 +0000] GET /url?action=dosometion&a=0&b=20&c=0&d=66&e=3&f=3&g=20 HTTP/1.1 "200"

分析:前面三个字段都可以通过简单的分割来获取,只是最后一个action字段,因为位置不固定,导致无法直接通过分割获取。好在,awk提供了相关的字符串函数供我们使用。
gsub(r,s) 在整个$0中用s替代r
gsub(r,s,t) 在整个t中用s替代r
index(s,t) 返回s中字符串t的第一位置
length(s) 返回s长度
match(s,r) 测试s是否包含匹配r的字符串
split(s,a,fs) 在fs上将s分成序列a
sprint(fmt,exp) 返回经fmt格式化后的exp
sub(r,s) 用$0中最左边最长的子串代替s
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分


从上面的函数中,我们发现,substr这个函数可以帮助我们取回想要的字符串;只要通过index获取到对应的位置;但是为了定位真正的长度,需要split配合使用,找到结束符&的位置。

实现实例:
awk -F'[ ?&=]' '{split($0,mydata,"action="); print $1,$4,$7, substr(mydata[2], 0, index(mydata[2], "&")-1)}' access.log-20130731 > tmp2.log

其中,split把整行划分为两部分,“action=”前面的部分和后面的部分。之后,通过index函数,定位“action=”后第一个出现的“&”的位置,并通过substr函数,把action的值取出来。需要注意的是,substr使用的时候,函数中的index函数返回的位置,必须是基于substr中传入的字符串而言,否则,会出现错误的结果。

提醒:基于字符串的操作,是非常耗性能的。如果不是必须,不要使用字符串操作函数,尽可能利用分割获取对应的取值。上述例子,同样大小的文件,如果action的位置固定,直接使用分割获取和采用字符串函数获取,性能相差几十倍以上。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值