先创建一个文件:vim hi

 

 取第2个字段和第3个字段:

awk '{print $2,$3}' hi     注意{}中的,逗号会在输出的时候转变为空格

 

加入字符说明:

 

 显示整行:

 

 

指定字段分隔符:-F

 

 内建变量:NF      NF:字段数量,  $NF代表最后一个字段

 

 NR:行数

 

 /regular expression/: 仅处理能够被此处的模式匹配到的行

 

取反:awk '!/^john/{print $2}' hi

 

上面的语句表示如果第三个字段大于等于500,则取第一和第三个字段

 

 判断最后一个字段是否为/bin/bash,如果是则打印第一和最后一个字段

 

 做模式匹配

 

cat hi

 做行范围匹配

 

取得行范围:

 

 if条件判断语句:判断第三个字段的值是否大于500

 

 字符替换:

echo "this is a test" | awk 'gsub("test","abd")'

 

cat hi

while循环:

 

NF代表当前行的字段数,length是个函数,取得$i这个字段的字符长度

 

 awk '/^tom/{i=1;while(i<=NF) {if(length($i)>=4){print $i,length($i)}; i++}}' hi

在while循环中又嵌套了if语句

 

上面的while语句也可以用for循环语句代替

awk '/tom/{for(i=1;i<=NF;i++) {print $i,length($i)}}' hi

 

实战:

  获得访问前10位的ip地址:cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10

 

  获取访问次数最多的文件或页面,取前20个:cat access.log | awk '{print $11}' | sort | uniq -c | sort -nr | head -20

 

  列出传输最大的几个exe文件(分析下载站的时候常用):cat access.log | awk '($7~/.exe/){print $10 " " $1 " " $4 " " $7}' | sort -nr | head -20

 

  列出输出大于200000byte(约200kb)的exe文件以及对应文件发生次数:cat access.log | awk '($10 > 200000 && $7~/.exe/){print $7}' | sort -n | uniq -c | sort -nr | head -100

 

  列出最最耗时的页面(超过60秒的)的以及对应页面发生次数:cat access.log | awk '($NF > 60 && $7 ~/.php/){print $7}' | sort -n | uniq -c | sort -nr | head -100

 

  统计网站流量(G):cat access.log | awk '{sum+=$10}END{print sum/1024/1024/1024}'

 

  统计404的连接:awk '($9~/404/)' access.log | awk '{print $9,$7}' | sort 

  

在Unix awk中两个特别的表达式,BEGIN和END,这两者都可用于pattern中(参考前面的awk语法),提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作

任何在BEGIN之后列出的操作(在{}内)将在Unix awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使

用END来输出最终结果

 

RS: 记录行分隔符

  文本A的内容为a|b|c  

  awk 'BEGIN{ RS="|" } { print $0 }'  A   得到的结果如下

  

  如果文本A的内容如上图

  awk 'BEGIN{ ORS="|" }{ print $0 }' A  得到的结果为 a|b|c

ORS: 将换行符替换成你想要的符号