作者:王文勤
时间:2017-12-01
- 概述
1.1 功能描述
AWK是以行为单位对匹配模式的行进行处理的文本分析工作。
1.2 通用格式
命令行调用:
awk [options] ‘pattern {action} pattern {action}’ filename
脚本调用:
awk [options] -f script.awk filename
pattern默认情况为匹配整行内容
action的默认情况为执行’{print $0}’,如果省略print参数,则使用$0作为参数
1.3 文本文件模型
内置变量
$0 这个变量包含执行过程中当前行的文本内容
NR 行号
FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始
NF 域的个数
OFS 输出域分隔符, 默认也是空格,可以改为制表符等 #BEGIN时定义
ORS 输出记录分隔符 #BEGIN时定义
FS BEGIN时定义分隔符
RS 输入记录分隔符
FILENAME 输入文件名
- 参数介绍
-F fs (fs=filed separator)指定分隔符,默认的分隔符是空格或Tab键
-f scripfile (file) 从脚本文件中读取awk命令 awk -f script.awk file
-v var=value 赋值一个用户定义变量
- 常见pattern
3.1 正则表达式
/正则表达式/
默认使用$0来匹配
如果指定字段进行匹配需要使用~符号
3.2 关系表达式
关系运算符: < <= > >= != ==
3.3逻辑运算符
pattern && pattern
pattern || pattern
!pattern
3.4 BEGIN和END
BEGIN初始化代码块,在对每一行进行处理之前,初始化代码,只执行一次。
END结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息。
3.5 组合模式
通用格式:awk ‘BEGIN {action_begin} pattern1 {action1} pattern2 {action2} END{action_end}’
原理:第一步,执行BEGIN{ commands }语句块中的语句。
第二步:以行为单位,依次从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块。
第三步:当读至输入流末尾时,执行END{ commands }语句块。
说明:三个语句块都是可选的。如果没有pattern{commands}语句块,则默认执行{print},而当使用不带参数的print时,它就打印当前行,当print的参数是以逗号进行分隔时,打印时则以空格作为定界符。
- 常见场景
4.1 找出状态码非200的所有请求
4.2 日志文件中统计访问量前10的IP
4.3 统计某个IP访问量高的域名
4.4 计算大小
4.5 求均值
4.6 响应时间占比
4.7 求各用户使用的内存量
4.8 各状态码占比
- 踩过的坑
5.1 变量引用
1).awk内定义的变量不使用$符合
2).内置变量中的引用字段使用 1 − 1- 1−n、$0
3).内置变量中FS、OFS、NR等变量不带$符合
5.2 在一个shell里,如果使用awk,如何调用shell的变量
对于awk里引用的变量需要用“‘$var’” 格式。
6,流程控制语句
6.1 条件判断语句
if(表达式)
{语句}
else if(表达式)
{语句}
else{语句}
6.2 while循环语句
while(表达式)
{语句}
6.3 for循环
for(变量 in 数组)
{语句}
或者
for(变量;条件;表达式)
{语句}
6.4 do循环
do {语句}
while(条件)
- 数组
在 awk 中数组叫做关联数组(associative arrays),因为下标记可以是数也可以是串。awk 中的数组不必提前声明,也不必声明大小。数组元素用 0 或空串来初始化,这根据上下文而定。
定义数组:array[index] = value 数组名array,下标index以及相应的值value。
读取数组:{ for (item in array) print array[item]}
- awk内置函数
system()
split()
length()
substr()
sub()
gsub()