awk功能确实很强大,可以对文本的每一行数据按指定字符分割(默认空格),得到多列,可以对某一列做统一处理,实乃日志分析利器
基本格式
awk [-F field-separator] 'commands' input
比如输出以空格为列分割的文本中 某一列的所有数据
cat xx.log | awk '{print $1}'
输入文件xx.log
tom 1
jack 2
jim 3
则输出为
tom
jack
jim
还有一个常见的应用,web日志get参数解析,常见weblog压缩文件,每行中会返回一些状态,假设log中第7列输出为url或者get参数
zcat /home/logs/*access.log.tar.gz | awk '{print $7}'
便可以将log中get参数内容解析出来,假设我们的get参数类似如下
act=xx&uid=kant&item=123
再进一步解析出所有act=xx的请求对应的uid和item,
zcat /home/logs/*access.log.tar.gz | awk '{print $7}'
| awk -F \& '($1~/act=xx/) {
uid="";
item
="";
for(i=2;i<=NF;i++){
if(match($i,"uid=")){
uid=substr($i,5);}
else if(match($i,"item=")){
item
=substr($i,6);}
}
if(uid
&& item &&item>0
&& (item~ /^[0-9]+$/) )
{print uid, item;}
}' > user_item.dat
试一下这个例子基本awk理解的就差不多了