awk简介
一种便于使用且表达能力强的程序设计语言,适用于计算和数据处理任务
awk与sed区别
sed 适用于在shell程序中对文本内容进行增删改查等操作
awk 适用于计算和数据处理任务
awk命令语法
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
awk命令运行过程
- 通过关键字BEGIN执行BEGIN后花括号{}后的内容
- pattern部分匹配成功后,依次对该行执行pattern后花括号后的内容,循环读取文件直到文件结束
- 开始 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)
- 跟C语言printf语句格式基本一致
- 按照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}