语法格式

  1. awk 'BEGIN{}pattern{commands}END{}' file_name
  2. standard 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 命令行参数数组
  1. # file
  2. Hadoop|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