awk简介

一种便于使用且表达能力强的程序设计语言,适用于计算和数据处理任务

awk与sed区别

sed 适用于在shell程序中对文本内容进行增删改查等操作
awk 适用于计算和数据处理任务

awk命令语法

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

awk命令运行过程

  1. 通过关键字BEGIN执行BEGIN后花括号{}后的内容
  2. pattern部分匹配成功后,依次对该行执行pattern后花括号后的内容,循环读取文件直到文件结束
  3. 开始 END 块执行,END 块可以输出最终结果

awk命令示例

图片说明

仅包含主体模块

打印出工作时间超过零小时的员工的姓名和工资(薪资乘以时间)

awk '$3 >0 { print $1, $2 * $3 }’ file  

包含主体模块和开始模块

打印出工作时间超过零小时的员工的姓名和工资,第一行输出字符串 NAME和SALARY

awk 'BEGIN {print “NAME SALARY”}  $3 >0 { print $1, $2 * $3 }' file

包含所有模块

打印出所有员工的姓名和工资,第一行输出字符串 NAME和SALARY,最后要输出员工数、付出的总薪酬以及员工的平均薪酬

awk 'BEGIN {print "NAME SALARY"}  
              { print $1, $2 * $3; 
                     pay=pay+$2*$3    }  
         END{ print NR, "employees"
                  print "total pay is", pay 
                  print "average pay is", pay/NR
                  }'  file

数据输出

简单输出

打印所有行
   { print }、{ print $0 }
打印特定字段
   { print NF, $1, $3 }、NF表示一行中字段总数量
   { print NR, $0 }、NR表示行号
打印时进行计算
   { print $1, $2 * $3 }
输出中添加内容
   { print "total pay for", $1, "is", $2 * $3 }

包含所有模块

对文件file进行处理,打印出行号、每行字段数、姓名工资信息

awk '{print NR,NF,$1,$2*$3}' file

格式化输出

printf (format, value1, value2, ..., valuen)

  1. 跟C语言printf语句格式基本一致
  2. 按照format格式排列输出内容

对文件file进行处理,打印出姓名、工资信息,并且要求姓名字段占8个字符宽度,对齐格式为左对齐;工资字段占6个字符的宽度,对齐格式为右对齐
awk '{ printf("%-8s $%6.2f\n", $1, $2 * $3) }' file

数据选择

通过对比选择
   $2 >=5 {print}

通过计算选择
   $2*$3>50 {print}

通过文本内容选择
   $1 == "Susie" {print}
   /Susie/ {print}

通过模式组合选择
   $2>=4||$3>=20 {print}