一、命令概述
awk是文本和数据进行处理的编程语言,取了其三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的姓的第一个字符。
二、命令语法
awk [命令选项] [脚本] [文件名]
1.常用命令选项
- -F fs field separator的缩写,(输入)字段分隔符
- -v var=value 用于自定义变量
- -f file 脚本文件
2.脚本语法
'BEGIN{} [模式]{[操作]} END{}'
- 脚本通常写在单引号中间
- 脚本的处理流程为:从输入流读取内容之前,先执行BEGIN语句块,然后逐行读取并按模式语句块处理,所有行读取并处理完成之后,最后执行END语句块
- 三个语句块可以任选其一、其二、其三,模式和操作也可以只存在其一
3.常用内置变量
- $0 完整的一条记录
- $n 本条记录中的第n个字段
- NR number of records 已经读入的行数
- NF number of fileds 当前行拥有的字段数
- FS field separator 输入字段分隔符,默认为所有空格
- RS records separator 输入记录分隔符,默认是一个换行
- OFS output filed separator 输出字段分隔符,默认与输入字段分隔符一致
- ORS output record separator 输出记录分隔符,默认是一个换行
4.常用内置函数
- index(a,b) 返回b在a中的起始位置,字符串要用双引号
- length(a) 返回a的长度
三、常用操作
testfile.txt
xm 11 12 13
xmm 31 32 33
xh 22 23 24
1.操作
- 获取文件指定列
# 打印第一列
awk '{print $0}' testfile.txt
# 打印第二列
awk '{print $1}' testfile.txt
# 打印第三列
awk '{print $2}' testfile.txt
# 打印最后一列
awk '{print $NF}' testfile.txt
- 修改分隔符
# 无效修改输出分隔符
awk '{OFS="#";print $0}' testfile.txt
# 有效修改输出分隔符
awk '{OFS="#";$1=$1;print $0}' testfile.txt
awk -v OFS=# '{$1=$1;print $0}' testfile.txt
awk '{OFS="#";print $1,$2,$3,$4}' testfile.txt
# 修改输入分隔符为#
awk '{OFS="#";print $1,$2,$3,$4}' testfile.txt | awk -F '#' '{print $1}'
- printf控制输出格式
# 格式化打印输出
awk '{printf "%-3s %-2d %-2d %-2dn",$1,$2,$3,$4}' testfile.txt
- 流程控制
# 打印第三行最后一个字段,其他行打印“不是第三行”
awk '{if(NR==3){print $NF} else {print "不是第三行"} }' testfile.txt
2.模式+操作
# 打印第二行的第一个字段
awk 'NR==2 {print $1}' testfile.txt
# 打印第1-3行的第一个字段
awk 'NR==1,NR==3 {print $1}' testfile.txt
# 打印第1行和第三行的第一个字段
awk 'NR==1||NR==3 {print $1}' testfile.txt
# 匹配以xm开头的行
awk '/xm/ {print $0}' testfile.txt
# 以xm开头的记录,第二个字段中,1所在的位置的索引
awk '/xm/{print index($2,1)}' testfile.txt
# 以xm开头的记录的长度
awk '/xm/{print length($0)}' testfile.txt
3.BEGIN+模式+操作
# 设置变量
awk 'BEGIN{OFS="#"} {$1=$1;print $0}' testfile.txt
# 添加标题
awk 'BEGIN{printf "%2s %2s %2s %2sn","姓名","语文","数学","英语"} {printf "%-4s %-4d %-4d %-4dn",$1,$2,$3,$3}' testfile.txt
4.BEGIN+模式+操作+END
# 最后添加一共有多少行
awk 'BEGIN{printf "%2s %2s %2s %2sn","姓名","语文","数学","英语"} NR>1 {printf "%-4s %-4d %-4d %-4dn",$1,$1,$3,$4} END{printf "%3s:%2d%1sn","一共有",NR,"行" }' testfile.txt
# 找到第二行,打印最后一个字段
awk 'BEGIN{ print "姓名" } NR==2{ print $1 } END{print "找到第2行啦"}' testfile.txt
5.脚本文件
awk脚本
BEGIN{
print "--------start awk--------"
printf "%2s %2s %2s %2s %2sn","姓名","语文","数学","英语","总分"
}
{
total=o
i=2
while(imax){
max=total
}
}
END{
printf "最高分为:%-4dn",max
}