语法格式
awk 'BEGIN{}pattern{commands}END{}' file_namestandard output | awk 'BEGIN{}pattern{commands}END{}'
| 语法格式 |
解释 |
| BEGIN{} |
正式处理数据之前执行 |
| pattern |
匹配模式 |
| {commands} |
处理命令, 可能多行 |
| END{} |
处理完所有匹配数据后执行 |
内置变量
| 内置变量 |
含义 |
| $0 |
整行内容 |
| $1-$n |
当前行的第1-n个字段 |
| NF (Number Field) |
当前行的字段个数, 也就是有多少列 |
| NR (Number Row) |
当前行的行号, 从1开始计数 |
| FNR (File Number Row) |
多文件处理时, 每个文件行号单独计数 |
| FS (Field Separator) |
输入字段分隔符, 不指定默认以空格或tab键分割 |
| RS (Row Separator) |
输入行分隔符, 默认回车换行 |
| OFS (Output Field Separator) |
输出字段分隔符, 默认为空格 |
| ORS (Output Row Separator) |
输出行分隔符, 默认为回车换行 |
| FILENAME |
当前输入的文件名字 |
| ARGC |
命令行参数个数 |
| ARGV |
命令行参数数组 |
# fileHadoop|spark|Flume--Java|Python|Scala|Go--Allen|Mike|Meggie
# 打印所有数据 $0表示整行
awk '{print $0}' /etc/passwd
# 以:为分隔符,打印第1个字段
awk 'BEGIN{FS=":"}{print $1}' /etc/passwd
# 以:为分隔符,打印每行有多少个字段
awk 'BEGIN{FS=":"}{print NF}' /etc/passwd
# 输出每行的行号
awk '{print NR}' /etc/passwd
# 指定行分隔符和字段分隔符
awk 'BEGIN{RS="--";FS="|"}{print $3}' file
# 指定输出行分隔符
awk 'BEGIN{RS="--";FS="|";ORS="&"}{print $3}' file
# 指定输出字段分隔符
awk 'BEGIN{RS="--";FS="|";ORS="&";OFS=":"}{print $1,$3}' file
# 输出文件名
awk '{print FILENAME}' file
格式化输出printf
| 格式符 |
含义 |
| %s |
打印字符串 |
| %d |
打印十进制数 |
| %f |
打印一个浮点数 |
| %x |
打印十六进制数 |
| %o |
打印八进制数 |
| %e |
打印数字的科学计数法形式 |
| %c |
打印单个字符的ASCII码 |
| 修饰符 |
含义 |
| - |
左对齐 |
| + |
右对齐 |
| # |
显示8进制在前面加0,显示16进制在前面加0x |
# 输出第1,7个字段, 每个字段占位20, 并且右对齐, 减号是左对齐
awk 'BEGIN{FS=":"}{printf "%20s %20s\n",$1,$7}' /etc/passwd
awk 'BEGIN{FS=":"}{printf "%-20s %-20s\n",$1,$7}' /etc/passwd
# 以10进制格式输出第3个字段, 占15位右对齐, -15是左对齐
awk 'BEGIN{FS=":"}{printf "%15d\n",$3}' /etc/passwd
# 以浮点数格式输出第3个字段, 保留2个小数点
awk 'BEGIN{FS=":"}{printf "%0.2f\n",$3}' /etc/passwd
# 以16进制输出第3个字段
awk 'BEGIN{FS=":"}{printf "%#x\n",$3}' /etc/passwd
模式匹配
| 语法格式 |
含义 |
| RegExp |
按正则表达式匹配 |
| 关系运算 |
按关系运算匹配 |
| 关系运算符匹配 |
|
| < |
小于 |
| > |
大于 |
| <= |
小于等于 |
| >= |
大于等于 |
| == |
等于 ( 即可用于数字, 也可用于字符串 ) |
| != |
不等于 |
| ~ |
匹配正则表达式 |
| !~ |
反向匹配正则表达式 |
| 布尔运算符匹配 |
|
| || |
或 |
| && |
与 |
| ! |
非 |
# 匹配文件行中含有root字符串的所有行
awk 'BEGIN{FS=":"}/root/{print $0}' /etc/passwd
# 匹配文件行中以yarn开头的所有行
awk 'BEGIN{FS=":"}/^yarn/{print $0}' /etc/passwd
# 匹配第3个字段小于50的所有行
awk 'BEGIN{FS=":"}$3<50{print $0}' /etc/passwd
# 匹配第7个字段是(或不是)/bin/bash的所有行
awk 'BEGIN{FS=":"}$7=="/bin/bash"{print $0}' /etc/passwd
awk 'BEGIN{FS=":"}$7!="/bin/bash"{print $0}' /etc/passwd
# 匹配第3个字段为3位数字的所有行
awk 'BEGIN{FS=":"}$3~/[0-9]{3,}/{print $0}' /etc/passwd
# 匹配第1个字段包含root的所有行
awk 'BEGIN{FS=":"}$1~/root/{print $0}' /etc/passwd
# 匹配文件中包含hdfs或yarn的所有行信息
awk 'BEGIN{FS=":"}$1=="hdfs"||$1=="yarn" {print $0}' /etc/passwd
# 匹配文件中第3个字段小于50并且第4个字段大于50的所有行信息
awk 'BEGIN{FS=":"}$3<50 && $4>50 {print $0}' /etc/passwd
# 匹配文件中第3个字段小于50并且第7个字段包含/bin/bash的所有行
awk 'BEGIN{FS=":"}$3<50 && $7~/\/bin\/bash/ {print $0}' /etc/passwd
动作表达式
| 运算符 |
含义 |
| + |
加 |
| - |
减 |
| * |
乘 |
| / |
除 |
| % |
模 |
| ^ ** |
乘方 |
| ++x |
返回x变量之前, x加1 |
| x++ |
返回x变量之后, x加1 |
# 打印两个变量
awk 'BEGIN{var=20;var1="hello";print var, var1}'
awk 'BEGIN{num1=20; num2=30; print num1+num2}'
# 计算文件中空白行的数量
awk '/^$/{sum=0;sum++}END{print sum}' /etc/services
# students.txt
Allen 80 90 76 43
Mike 35 98 57 68
Jerry 97 75 97 66
# 统计平均分并按格式打印
awk 'BEGIN{printf "%-8s%-5s%-5s%-5s%-5s%-5s\n", "姓名", "语文", "数学", "英语", "物理", "平均分"}{total=$2+$3+$3+$5;AVG=total/4;printf "%-8s%-5d%-5d%-5d%-5d%.2f\n",$1,$2,$3,$4,$5,AVG}' students.txt