AWK 基本语法结构
深入学习 AWK:AWK 基本语法结构 🐧
# 学习目标
- 理解 AWK 的基本语法结构和执行流程
- 掌握如何使用
awk命令从文本中提取数据并处理 - 了解 AWK 的模式匹配机制(pattern-action)
- 能够编写简单的 AWK 脚本进行数据统计与格式化输出
- 结合 Linux 日志分析等实际场景练习 AWK 的用法
# 核心重点 🔑
| 内容 | 描述 |
|---|---|
| 基本结构 | awk '/pattern/ {action}' file |
| 输入分隔符 | 默认为空格或制表符,可自定义为逗号、冒号等 |
| 内置变量 | NR, NF, $0, $1, FS, OFS, RS, ORS |
| BEGIN/END 块 | BEGIN{} 在读取文件前执行,END{} 在文件处理完后执行 |
| 模式匹配 | 支持正则表达式 /regex/ 或条件判断如 $3 > 100 |
| 字段引用 | $1 表示第一列,$NF 表示最后一列 |
| 脚本运行方式 | 可以写成 .awk 文件并通过 -f script.awk 运行 |
# 详细讲解 📚
📘 什么是 AWK?
AWK 是一种专门用于 文本处理的编程语言,尤其适合处理以行为单位、列结构化的文本数据。它在 Linux 中广泛用于日志分析、系统监控、报表生成等任务。
💡 小贴士:AWK 的名字来自三位创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母。
🧱 AWK 基本语法结构
awk 'BEGIN {初始化动作} /pattern/ {处理动作} END {收尾动作}' 文件名
示例 1:打印所有行
awk '{print}' filename.txt
这会逐行输出文件内容,类似于 cat filename.txt。
示例 2:打印指定字段
假设有一个 data.csv 文件内容如下:
张三,北京,85
李四,上海,92
王五,广州,78
我们可以这样提取第二列(城市):
awk -F ',' '{print $2}' data.csv
输出:
北京
上海
广州
🛠️ 内置变量详解
| 变量 | 含义 | 示例 |
|---|---|---|
NR |
当前行号(Number of Records) | NR==1 {print "这是第一行"} |
NF |
当前行的字段数(Number of Fields) | NF > 3 {print $0} |
| $0 | 整行内容 | print $0 打印整行 |
| $n | 第 n 个字段(从1开始) | print $1, $3 打印第1和第3列 |
FS |
输入字段分隔符(默认空格) | -F ':' 或 BEGIN{FS=","} |
OFS |
输出字段分隔符 | `BEGIN{OFS=" |
RS |
输入记录分隔符(默认换行) | BEGIN{RS=";"} |
ORS |
输出记录分隔符 | BEGIN{ORS="\n---\n"} |
示例 3:打印行号和字段数量
awk '{print "行号:" NR ", 字段数:" NF}' data.csv
输出:
行号:1, 字段数:3
行号:2, 字段数:3
行号:3, 字段数:3
🎯 模式匹配(Pattern)
AWK 的强大之处在于它可以根据 模式匹配 来决定是否执行某个动作。
正则表达式匹配
awk '/上海/ {print}' data.csv
输出包含“上海”的行。
条件匹配
awk '$3 > 80 {print $1 " 分数合格"}' data.csv
输出:
李四 分数合格
⏱️ BEGIN 与 END 块
BEGIN {}:在读取任何输入之前执行一次。END {}:在所有输入处理完成后执行一次。
示例 4:添加标题和结尾信息
awk 'BEGIN {print "姓名\t城市\t分数"} {print $1 "\t" $2 "\t" $3} END {print "数据结束"}' data.csv
输出:
姓名 城市 分数
张三 北京 85
李四 上海 92
王五 广州 78
数据结束
📁 使用外部文件运行 AWK 脚本
将 AWK 脚本保存到文件中,便于复用和维护。
创建 script.awk:
BEGIN {
print "=== 成绩报告 ==="
printf "%-10s %-10s %s\n", "姓名", "城市", "分数"
}
{
printf "%-10s %-10s %d\n", $1, $2, $3
}
END {
print "=== 报告结束 ==="
}
运行脚本:
awk -F ',' -f script.awk data.csv
输出:
=== 成绩报告 ===
姓名 城市 分数
张三 北京 85
李四 上海 92
王五 广州 78
=== 报告结束 ===
🧪 实际应用场景:Linux 日志分析 🛡️
场景描述:
我们有如下 Nginx 日志片段(access.log):
192.168.1.100 - - [22/Jun/2025:10:00:01 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
192.168.1.101 - - [22/Jun/2025:10:00:02 +0800] "GET /about.html HTTP/1.1" 200 1024 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)"
192.168.1.100 - - [22/Jun/2025:10:00:03 +0800] "GET /index.html HTTP/1.1" 404 0 "-" "curl/7.68.0"
目标:
提取访问 /index.html 的 IP 地址和状态码。
awk '$7 == "/index.html" {print $1, $9}' access.log
输出:
192.168.1.100 200
192.168.1.100 404
⚙️ 不同发行版的差异说明
| 发行版 | 特点 | 注意事项 |
|---|---|---|
| Ubuntu | 默认安装的是 mawk(轻量级实现) |
性能略逊于 gawk,但兼容性好 |
| CentOS/RHEL | 默认是 gawk(GNU AWK) |
功能更完整,支持更多特性 |
| EulerOS/OpenEuler | 默认是 gawk |
更适合企业级日志分析 |
| macOS | 默认是 nawk(New AWK) |
部分功能可能不兼容 gawk |
✅ 建议:如果你需要高级功能(如数组、函数等),请确保你使用的是
gawk,可通过awk --version查看。
🧠 练习建议(动手试试!)
- 基础题:编写一个 AWK 命令,统计
/etc/passwd中 shell 为/bin/bash的用户数量。 - 进阶题:写一个 AWK 脚本,分析 Apache 日志,统计每个 IP 的访问次数。
- 挑战题:结合
df -h输出,提取磁盘使用率超过 80% 的分区,并高亮显示。
🧾 小结
AWK 是 Linux 文本处理的利器,掌握其基本语法结构可以让你轻松应对日志分析、报表生成等常见任务。它的核心在于 模式匹配 + 动作,配合丰富的内置变量和灵活的控制结构,非常适合做结构化文本的数据清洗与统计。
继续深入学习 AWK,下一章我们将进入《AWK 数组与函数》🚀
如需追加问题,请输入:
追加问题:xxxx

浙公网安备 33010602011771号