AWK 详解:文本处理的瑞士军刀
AWK 是一种强大的文本处理工具和编程语言,专为逐行处理结构化文本(如日志、CSV、配置文件)设计。其名称来自三位创始人姓氏的首字母(Aho、Weinberger、Kernighan)。以下是 AWK 的全面解析,涵盖基础到高级用法。
一、AWK 基础语法
1. 基本命令结构
awk '模式 {动作}' 文件名
- 模式:决定哪些行需要处理(如正则表达式、条件判断)
- 动作:对匹配的行执行的操作(如打印、计算)
2. 常用命令行选项
| 选项 | 作用 |
|---|---|
-F | 指定字段分隔符(默认空格/TAB) |
-v | 定义变量(如 -v var=value) |
-f | 从脚本文件读取 AWK 程序 |
二、核心概念与内置变量
1. 字段与分隔符
$0:整行内容$1, $2, ..., $NF:第1到最后一列NF:当前行的字段数NR:当前行号FS:输入字段分隔符(同-F)OFS:输出字段分隔符(默认空格)
示例:提取特定列
# 提取日志的第1列(IP地址)
awk '{print $1}' access.log
# 指定冒号为分隔符(如/etc/passwd)
awk -F: '{print $1, $6}' /etc/passwd
三、模式匹配与条件处理
1. 正则表达式匹配
# 打印包含 "error" 的行
awk '/error/ {print}' log.txt
# 忽略大小写匹配(GNU AWK)
awk 'BEGIN{IGNORECASE=1} /error/' log.txt
2. 条件判断
# 第3列大于100时打印整行
awk '$3 > 100' data.txt
# 多条件组合(AND/OR)
awk '$1 == "admin" && $2 > 50' users.txt
3. 范围模式
# 处理从 "start" 到 "end" 之间的行
awk '/start/,/end/ {print}' file.txt
四、数据处理与计算
1. 数学运算
# 计算第2列的总和
awk '{sum += $2} END {print sum}' data.txt
# 求平均值
awk '{sum += $1; count++} END {print sum/count}' numbers.txt
2. 字符串操作
# 连接字段(用冒号分隔)
awk '{print $1 ":" $3}' data.txt
# 字符串长度
awk '{print length($1)}' words.txt
3. 格式化输出
# 使用 printf 格式化(类似C语言)
awk '{printf "%-10s %5d\n", $1, $2}' data.txt
五、高级功能
1. BEGIN 和 END 块
BEGIN:处理数据前执行(如初始化变量)END:处理完所有数据后执行(如输出统计结果)
# 计算文件行数和总字段数
awk 'BEGIN {print "Start Processing"}
{total_fields += NF}
END {print "Total Lines:", NR, "Total Fields:", total_fields}' file.txt
2. 数组与哈希表
# 统计IP出现次数
awk '{ip_count[$1]++} END {for (ip in ip_count) print ip, ip_count[ip]}' access.log
# 去重
awk '!seen[$0]++' duplicates.txt
3. 自定义函数
# 定义函数计算平方
awk 'function square(x) {return x*x} {print $1, square($1)}' numbers.txt
六、实战案例
1. 日志分析
# 统计HTTP状态码分布
awk '{status[$9]++} END {for (s in status) print s, status[s]}' access.log
# 提取特定时间段的日志
awk '/10\/Oct\/2023:15:00/,/10\/Oct\/2023:16:00/' access.log
2. 数据清洗
# 删除空行
awk 'NF > 0' file.txt
# CSV转JSON(简易版)
awk -F, 'BEGIN {print "["}
{printf " {\"name\":\"%s\",\"age\":%s}%s\n", $1, $2, (NR==FNR ? "" : ",")}
END {print "]"}' data.csv
3. 系统监控
# 显示内存占用最高的进程
ps aux | awk '{printf "%s %s %.1fMB\n", $11, $1, $6/1024}' | sort -k3 -nr | head -n 5
七、调试与优化
1. 调试技巧
# 打印行号和内容(调试用)
awk '{print NR, $0}' file.txt
# 显示字段分割结果
awk 'BEGIN {FS=":"} {for (i=1; i<=NF; i++) print "Field", i, ":", $i}' /etc/passwd
2. 性能优化
- 减少管道:尽量在单个 AWK 命令中完成操作
- 预编译模式:对大型文件,使用
-f从脚本文件读取程序
八、与其他工具对比
| 工具 | 适用场景 | 特点 |
|---|---|---|
| AWK | 结构化文本处理、字段操作、统计 | 编程能力强,支持复杂逻辑 |
| sed | 简单替换、删除、插入 | 流编辑,适合行级操作 |
| grep | 快速搜索过滤 | 只匹配,不修改内容 |
掌握 AWK 后,你可以轻松处理日志分析、数据转换、报表生成等任务。它是 Linux/Unix 系统管理员的必备技能!
423

被折叠的 条评论
为什么被折叠?



