awk使用的简单例子

原始文本命名为log,内容只有一行:
Shell代码 复制代码
  1. 2010-10-12 10:46:32,663 INFO [com.peacock.rest.service.impl.MessageRestServiceImpl] - am=getUnreadMessageCount<|>ab=100<|>af=iPhone<|>adid=13288785908f5fe3fa6f1ef4a419c0cb5e5a72cc<|>aip=58.163.175.132<|>wv=1.0<|>asid=3CBCD99761FEA49C571731727C7B9EF0<|>iua=iPhone<|>pov=3.1.2<|>abt=1<|>at=2010-10-12 10:46:32<|>ar=_<|>auid=479625<|>acode=000000<|>art=0  


如何以空格分割各字段:
Shell代码 复制代码
  1. cat log|awk '{print $数字}'  
分别为(默认以空格分割):
1 2010-10-12
2 10:46:32,663
3 INFO
4 [com.peacock.rest.service.impl.MessageRestServiceImpl]
... ...

如何截取以am=开头的字符串:
Shell代码 复制代码
  1. cat log|awk '{match($0,"am=");print substr($0,RSTART)}'  
这里使用了match和substr两个内置函数。其中$0表示整行记录。

对以am=开头的字符串进行<|>分割:
Shell代码 复制代码
  1. cat log|awk '{match($0,"am=");print substr($0,RSTART)}'|awk -F "<[|]>" '{print $数字}'  
这里使用管道再次调用了awk。
注意,因为<|>作为分隔符比较特殊,如果单纯使用<|>,awk会认为使用<或者>来分割。所以遇到|作为分隔符的话,使用[|]转义一下就可以了。
1 am=getUnreadMessageCount
2 ab=100
3 af=iPhone
4 adid=13288785908f5fe3fa6f1ef4a419c0cb5e5a72cc
... ...

输出每个函数以及执行它所花的时间(其中am=表示函数名,art=表示执行时间):
Shell代码 复制代码
  1. cat log|awk '{match($0,"am=");print substr($0,RSTART)}'|awk -F "<[|]>" '{match($0,"art=[0-9]+");art=substr($0,RSTART,RLENGTH);printf "%s %d\n",substr($1,4),substr(art,5)}'  
输出:
getUnreadMessageCount 0
关键地方是使用match和substr来获取art的值。

如果有多行记录,对它们进行排序:
Shell代码 复制代码
  1. cat log|awk '{match($0,"am=");print substr($0,RSTART)}'|awk -F "<[|]>" '{match($0,"art=[0-9]+");art=substr($0,RSTART,RLENGTH);printf "%s %d\n",substr($1,4),substr(art,5)}'|sort -k1,1 -k2rn  
这里使用了sort命令和-k选项。首先根据函数名进行排序,然后再根据执行时间进行降序。
  网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)