以下是对 awk 命令的逐步详解,结合核心原理与生活化比喻,帮助零基础用户快速上手:
📖 一、核心概念:文本处理的流水线
awk 本质:
一个按行处理文本的编程工具,像工厂流水线一样逐行扫描文件,根据规则提取或修改数据。
- 输入:文本文件(如日志、CSV)
- 输出:筛选后的内容、统计结果或格式化文本
核心流程:
🔧 二、基础语法:四步上手
命令结构:
awk '模式 {动作}' 文件名 # 模式决定“哪些行”,动作决定“做什么”
1. 字段分割(拆解文本)
- 默认分割符:空格或制表符(如
Hello World
→$1="Hello"
,$2="World"
) - 自定义分割符:用
-F
指定awk -F':' '{print $1}' /etc/passwd # 按冒号分割,输出用户名
2. 内置变量(自动计数器)
变量 | 作用 | 示例 |
---|---|---|
$0 | 当前整行内容 | awk '{print $0}' file |
$1 | 第1个字段 | awk '{print $1}' file |
NF | 当前行的字段总数 | awk '{print $NF}' 输出最后一列 |
NR | 当前行号(从1开始) | awk '{print NR, $0}' 加行号 |
3. 模式匹配(筛选条件)
- 空模式:处理所有行(默认)
awk '{print $1}' file.txt # 每行都输出第1列
- 正则匹配:筛选含关键词的行
awk '/error/ {print $0}' log.txt # 输出含 “error” 的行
- 条件判断:按字段值筛选
awk '$3 > 100 {print $1}' data.csv # 第3列>100时输出第1列
4. 动作(执行操作)
- 打印内容:
print
或printf
(格式化)awk '{printf "Name: %-10s Age: %d\n", $1, $2}' data.txt
- 统计计算:求和、平均值等
awk '{sum += $2} END {print "总和:", sum}' data.txt # 对第2列求和
🚀 三、进阶技巧:高效场景
1. BEGIN/END 块(头尾处理)
BEGIN
:预处理(如打印表头)awk 'BEGIN {print "Start Processing..."} {print $1}'
END
:后处理(如输出统计)awk '{count++} END {print "总行数:", count}' file
2. 数组统计(词频分析)
awk '{words[$1]++} END {for(w in words) print w, words[w]}' text.txt
输出:
Apple 3
Banana 2
Orange 1
3. 多文件处理
awk 'FNR==1 {print "--- 文件:", FILENAME " ---"} {print $1}' file1.txt file2.txt
🧩 四、综合案例:实战演练
场景1:分析Nginx日志
# 统计每个IP的访问次数
awk '{ip_count[$1]++} END {for(ip in ip_count) print ip, ip_count[ip]}' access.log
场景2:数据清洗CSV
# 删除第3列为空的行
awk -F',' '$3 != "" {print $0}' dirty_data.csv
场景3:生成报告
awk 'BEGIN {FS=":"; print "用户列表"} {print "用户名:", $1} END {print "------"}' /etc/passwd
💎 总结:学习路径建议
- 新手入门:掌握字段分割(
-F
)和基础打印(print $1, $NF
)。 - 进阶提升:熟练使用模式匹配(
/regex/
)和统计计算(sum += $2
)。 - 高手之路:活用数组和流程控制(
if/for
)解决复杂问题。
附:更多示例可参考 GNU Awk 手册,或实践命令
man awk
。