AWK笔记


awk '匹配模式 {动作}'

  1. 每个awk程序都是一个或多个模式-动作语句:pattern { action } 如与BEGIN{},END{}多个模式-动作并存

  2. 模式和动作可以省略其中之一

  3. 模式和动作写在单引号中

  4. 使用大括号包围动作,以与模式区分开

  5. 多个动作写在一行时,通过;隔开

  6. 在 awk 中仅仅只有两种数据类型: 数值和字符构成的字符串

  7. Awk 程序一次从输入文件的中读取一行内容并把它分割成一个个字段, 通常默认情况下, 一个字段是一个不包含任何空格或制表符的连续字符序列.

  8. 每行的字段数量存储在NF变量中

    {print NF}
    
  9. 已经读取的行数存储在NR变量中

    {print NR}
    
  10. 匹配模式可以是数值计算($1*$s>10),正则(/正则/),也可以用&& || ! 对模式进行组合

执行顺序

执行顺序:检测输入行是否符合匹配模式,如果符合就执行相应的动作

BEGIN和END

  1. 特殊模式 BEGIN 用于匹配第一个输入文件的第一行之前的位置

  2. BEGIN通常放在''内的开始的地方

  3. END 则用于匹配处理过的最后一个文件的最后一行之后的位置

在动作中执行计算

  1. 在动作中用户可以使用自己的变量,而且不需要声明。数字类型的变量默认初始化为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
      }
    }