AWK 初级学习手册-终极基础版
一、认识 AWK
- 什么是 AWK
- 一款文本处理工具,擅长分析结构化文本(日志、表格等)
 - 名称源自三位开发者(Aho、Weinberger、Kernighan)的首字母
 - 核心能力:按行读取、按字段分割、支持条件判断和计算
 
 - 安装与验证
- 检查是否预装:
awk --version(Linux 通常自带) - 安装命令:Ubuntu/Debian 用 
apt install gawk,CentOS 用yum install gawk - 查看帮助:
awk -h或awk --help(获取完整选项说明) - 入门测试:
awk 'BEGIN {print "Hello AWK"}'(输出欢迎语) 
 - 检查是否预装:
 
二、AWK 基本语法与选项
- 核心用法格式
# 方式1:直接指定处理程序 awk [选项] '处理程序' 文件名... # 方式2:从文件读取处理程序 awk [选项] -f 程序文件.awk 文件名... - 常用选项说明选项长选项说明
-f progfile--file=progfile从文件读取 AWK 程序-F fs--field-separator=fs指定字段分隔符(替代默认空格)-v var=val--assign=var=val定义变量并赋值(处理前生效)-e 'program'--source='program'直接指定 AWK 程序文本-h--help显示帮助信息-V--version显示版本信息 - 示例:选项使用
# 用 -v 定义变量,计算时使用 awk -v base=10 '{print $1 + base}' numbers.txt # 用 -e 直接指定程序(适合短逻辑) awk -e '{print NR, $0}' file.txt # 用 -f 从脚本文件读取程序 awk -f process.awk data.txt 
三、行与字段处理
- 行处理基础
- 逐行读取:AWK 默认按行处理文件
 - 行号变量 
NR:表示当前行号(示例:awk '{print NR, $0}' file.txt打印行号+整行) 
 - 字段分割与访问
- 默认分隔符:空格或制表符
 - 字段变量:
$0(整行)、$1(第1字段)、$2(第2字段)…$NF(最后字段) - 字段总数 
NF:示例:awk '{print "共", NF, "个字段,最后字段:"$NF}' file.txt 
 - 自定义分隔符(-F 选项)
- 示例:
awk -F ',' '{print $1, $3}' data.csv(按逗号分割CSV) - 多分隔符:
awk -F '[: ]' '{print $1}' /etc/passwd(按冒号或空格分割) 
 - 示例:
 
四、模式(筛选行的条件)
- 正则表达式模式
- 格式:
/正则内容/(匹配包含该内容的行) - 示例:
- 匹配 “success”:
awk '/success/ {print}' log.txt - 排除 “error”:
awk '!/error/ {print}' log.txt 
 - 匹配 “success”:
 
 - 格式:
 - 比较表达式模式
- 运算符:
==(等于)、!=(不等于)、>(大于)等 - 示例:
- 第2字段>100:
awk '$2 > 100 {print}' data.txt - 第1字段是”admin”:
awk '$1 == "admin" {print}' user.txt 
 - 第2字段>100:
 
 - 运算符:
 - 行号范围模式
- 用 
NR指定:awk 'NR >=5 && NR <=10 {print}' file.txt(打印5-10行) 
 - 用 
 - BEGIN 与 END 块
BEGIN:处理文件前执行(如打印表头)END:处理文件后执行(如汇总结果)- 示例:
awk 'BEGIN {print "开始"} {print} END {print "共处理", NR, "行"}' file.txt 
 
五、动作(处理行的操作)
- 打印操作
print:直接输出(默认换行),如awk '{print $1, $3}' file.txtprintf:格式化输出,如awk '{printf "姓名:%s,年龄:%d\n", $1, $2}' student.txt- 格式符:
%s(字符串)、%d(整数)、%f(浮点数) 
- 格式符:
 
 - 变量与运算
- 自定义变量:直接赋值(无需声明类型),如 
sum = $2 + $3 - 常用运算:
+-*/(加减乘除)、+=(累加) - 示例:计算平均值:
awk 'BEGIN {total=0} {total+=$2} END {print total/NR}' scores.txt 
 - 自定义变量:直接赋值(无需声明类型),如 
 - 条件判断
- 语法:
if (条件) {动作} else {动作} - 示例:
awk '{if ($2>=60) print $1,"及格"; else print $1,"不及格"}' scores.txt 
 - 语法:
 
六、数组基础
- 关联数组特性
- 键可以是字符串或数字,无需声明长度
 - 赋值:
数组名[键] = 值,如awk 'BEGIN {arr["name"]="Tom"; print arr["name"]}' 
 - 数组遍历
- 语法:
for (键 in 数组) {处理} - 示例:
awk 'BEGIN {arr[1]="a"; arr[2]="b"; for(i in arr) print i, arr[i]}' 
 - 语法:
 - 简单统计
- 示例:统计单词出现次数:
echo "a b a c" | awk '{for(i=1;i<=NF;i++) count[$i]++} END {for(w in count) print w, count[w]}' 
 - 示例:统计单词出现次数:
 
七、官方示例解析
根据 awk -h 提供的示例,理解核心用法:
- 求和示例
gawk '{ sum += $1 }; END { print sum }' file- 功能:计算文件中第1列所有数值的总和
 - 解析:每行执行 
sum += $1(累加第1字段),最后在END块打印总和 
 - 提取用户名示例
gawk -F: '{ print $1 }' /etc/passwd- 功能:从系统用户文件中提取所有用户名
 - 解析:用 
-F:指定冒号为分隔符,打印每行第1字段(用户名) 
 
八、初级实战示例
- 内容提取
- 提取日志IP:
awk '{print $1}' access.log - 提取CSV列:
awk -F ',' '{print $2, $4}' data.csv 
 - 提取日志IP:
 - 数据统计
- 求和:
awk '{sum+=$3} END {print sum}' numbers.txt - 统计行数:
awk 'END {print NR}' file.txt 
 - 求和:
 - 格式转换
- 替换分隔符:
awk 'BEGIN {OFS=","} {print $1,$2,$3}' space.txt(空格转逗号) 
 - 替换分隔符:
 
九、常见问题与解决
- 字段索引错误:区分 
$0(整行)和$1(第1字段) - 分隔符问题:用 
-F明确指定分隔符(如处理CSV必须指定,) - 变量未初始化:计算前用 
BEGIN初始化变量(如BEGIN {sum=0}) - 过滤空行:
awk 'NF>0' file.txt(NF>0表示非空行) 
