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 查看。


🧠 练习建议(动手试试!)

  1. 基础题:编写一个 AWK 命令,统计 /etc/passwd 中 shell 为 /bin/bash 的用户数量。
  2. 进阶题:写一个 AWK 脚本,分析 Apache 日志,统计每个 IP 的访问次数。
  3. 挑战题:结合 df -h 输出,提取磁盘使用率超过 80% 的分区,并高亮显示。

🧾 小结

AWK 是 Linux 文本处理的利器,掌握其基本语法结构可以让你轻松应对日志分析、报表生成等常见任务。它的核心在于 模式匹配 + 动作,配合丰富的内置变量和灵活的控制结构,非常适合做结构化文本的数据清洗与统计。


继续深入学习 AWK,下一章我们将进入《AWK 数组与函数》🚀

如需追加问题,请输入:
追加问题:xxxx

posted @ 2025-06-22 22:10  红尘过客2022  阅读(59)  评论(0)    收藏  举报