AWK笔记
awk '匹配模式 {动作}'
-
每个awk程序都是一个或多个模式-动作语句:pattern { action } 如与BEGIN{},END{}多个模式-动作并存
-
模式和动作可以省略其中之一
-
模式和动作写在单引号中
-
使用大括号包围动作,以与模式区分开
-
多个动作写在一行时,通过;隔开
-
在 awk 中仅仅只有两种数据类型: 数值和字符构成的字符串
-
Awk 程序一次从输入文件的中读取一行内容并把它分割成一个个字段, 通常默认情况下, 一个字段是一个不包含任何空格或制表符的连续字符序列.
-
每行的字段数量存储在NF变量中
{print NF}
-
已经读取的行数存储在NR变量中
{print NR}
-
匹配模式可以是数值计算($1*$s>10),正则(/正则/),也可以用&& || ! 对模式进行组合
执行顺序
执行顺序:检测输入行是否符合匹配模式,如果符合就执行相应的动作
BEGIN和END
-
特殊模式 BEGIN 用于匹配第一个输入文件的第一行之前的位置
-
BEGIN通常放在''内的开始的地方
-
END 则用于匹配处理过的最后一个文件的最后一行之后的位置
在动作中执行计算
-
在动作中用户可以使用自己的变量,而且不需要声明。数字类型的变量默认初始化为0
$3 > 15 { emp = emp + 1 } END { print emp, "employees worked more than 15 hours" } $2 > maxrate { maxrate = $2; maxemp = $1 } #自定义变量也可以定义在模式部分,maxrate初始化为0
在动作中执行字符串拼接
{names = names $1 " "} #将names,第一个字段,空字符拼接成大字符传赋值给自定义变量names
END { print names }
Beth Dan Kathy Mark Mary Susie
打印最后一个输入行
{last=$0} END{print last}
内置函数
length($1) 求字符的长度
控制语句
if-else语句
$2 > 6 { n = n + 1; pay = pay + $2 * $3 }
END { if (n > 0)
print n, "employees, total pay is", pay,
"average pay is", pay/n
else
print "no employees are paid more than $6/hour"
}
while语句
{ i = 1
while (i <= $3) {
printf("\t%.2f\n", $1 * (1 + $2) ^ i) //^ 是指数操作符
i = i + 1
}
}
for语句
{ for (i = 1; i <= $3; i = i + 1)
printf("\t%.2f\n", $1 * (1 + $2) ^ i)
}
数组
{line[NR] = $0 } # 记下每个输入行,存到数组line中
END { i = NR # 逆序打印
while (i > 0) {
print line[i]
i = i - 1
}
}