Linux文本处理:从不规则列/非固定列中截取关键字-方法2

35 篇文章 0 订阅

之前的一篇文章中提到了使用grep -o来从不规则列/非固定列中截取关键字的方法,链接如下

http://blog.csdn.net/qingsong3333/article/details/77342085

在学习了awk之后,发现awk可以使用内置变量+内置函数实现相同的功能,还是以之前的那个log为例子:某数据库的log.txt中,每访问一次表,就会记录一条信息"TableId = x",其中x为整数数字,但其他部分的文本没有任何规律。我们需要统计出每个表访问的次数,并按照访问次数排序:

例如某日志如下:
qingsong@db2a:~$ cat log.txt
Hello, world, TableId = 19039 jl
This is a long story TableId = 1909 jlsfd
TableId = 39 sdlf where
PID : 28703 TID : TableId =
he TableId = 9 EDUNAME: db2sysc 0
FUNCTION: DB2 UDB, Self tuning memory manager, stmm
### TableId = 29099 ::: ::
SSAGE : ADM7513W TableId = 1 SSAGE : ADM7513W
Are you TableId = 9
2017-08-16-23.36.17.920719 Hello, world, TableId = 29099 xxl
Hello, world, TableId = 19039 jl
This is a long story TableId = 1909 jlsfd
TableId = 393 sdlf where
PID : 2 TableId = 8703 TID :
he TableId = 19 EDUNAME: db2sysc 0
FUNCTION: DB2 UDB, Self tuning memory manager, stmm
anager, stmm ### TableId = 29099 ::: ::
Sanager, stmmSAGE : ADM7513W TableId = 1 SSAGE : ADM7513W
Are you TableId = 9 anager, stmm
719 Hello, world, TableId = 29099 xxl2017-08-16-23.36.1

使用awk完成的关键之处有两点:首先,使用match函数匹配关键字,如果某个子串匹配,就打印该子串。第二点,打印该子串后,将行的内容重新赋值为该子串后面的内容。
例如,某一行内容为"aa123bb456",要匹配数字。首先找到第一个匹配的子串为123,匹配之后,打印该子串;然后将该行内容重置为123之后的内容,即"bb456",重新匹配,直到没有可以匹配的子串,具体实现如下:
qingsong@db2a:~$ awk '
> {
>      r = "TableId = [0-9]+"
>      while (match($0,r)) {
>           print substr($0, RSTART, RLENGTH)        #打印匹配的子串
>           $0 = substr($0, RSTART + RLENGTH)      #将该行内容重置为匹配子串后面的内容
>      }
> }' log.txt
TableId = 19039
TableId = 1909
TableId = 39
TableId = 9
TableId = 29099
TableId = 1
TableId = 9
TableId = 29099
TableId = 19039
TableId = 1909
TableId = 393
TableId = 8703
TableId = 19
TableId = 29099
TableId = 1
TableId = 9
TableId = 29099

qingsong@db2a:~$ awk '
> {
>      r = "TableId = [0-9]+"
>      while (match($0,r)) {
>           print substr($0, RSTART, RLENGTH)
>           $0 = substr($0, RSTART + RLENGTH)
>      }
> }' log.txt | awk '{print $3}' | sort -n | uniq -c | sort -nr
4 29099
3 9
2 1909
2 19039
2 1
1 8703
1 393
1 39
1 19

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值