AWK 是一种强大的文本处理工具,擅长逐行分析文本并按字段处理数据。其核心功能包括模式匹配、字段操作、数学运算及逻辑控制,常用于日志分析、数据提取和报表生成。以下是关键要点:
1. 基础语法与执行流程- 命令格式:awk [选项] '模式或条件 {操作}' 文件1 文件2 …awk -f 脚本文件禅伏 文件1 文件2 …
- 执行流程:
BEGIN{}:处理文本前执行(如初始化变量)。
模式匹配:逐行匹配条件(如正则表达式)。
{}:对匹配行执行操作(如打印字段)。
END{}:处理完所有行后执行(如统计结果)。
2. 内建变量与字段操作3. 模式匹配与条件控制- 正则匹配:awk '/^root/ {print}' /etc/passwd # 匹配以root开头的行awk '$7 ~ /bash/ {print $1}' /etc/passwd # 第7字段包含bash的用户名
- 逻辑运算:awk '$3 >= 1000 && $NF == "/bin/bash" {print}' /etc/passwd # UID≥1000且shell为bash的用户awk '!(NR % 2) {print}' file.txt # 输贺扰携出偶数行
4. 数学运算与三元操作- 基本运算:awk '{print $1 + $2}' data.txt # 字段相加awk '{print 2^3}' # 计算2的3次方
- 三元运算符:awk '{max = ($1 > $2) ? $1 : $2; print max}' data.txt # 输出每行较大值
5. 高级用法- 调用Shell命令:awk '{print | "wc -l"}' file.txt # 统计行数free -m | awk '/Mem:/ {print $3*100/($3+$4)}' # 计算内存使用百分比
- 多文件处理:awk 'FNR == 1 {print "---", FILENAME} {print}' file1.txt file2.txt # 处理多文件时标记文件名
- BEGIN/END示例:awk 'BEGIN {FS=":"; sum=0} {sum+=$3} END {print "UID总和:", sum}' /etc/passwd
6. 注意事项- 分隔符优先级:FS 变量优先级高于李野 -F 选项(如 awk 'BEGIN{FS=":"} {print $1}')。
- getline行为:
无重定向时:读取当前文件的下一行(可能跳过行)。
有重定向时:读取外部命令或文件的首行。
awk '{getline < "data.txt"; print $0}' file.txt # 读取data.txt的首行
7. 实际应用场景- 日志分析:awk '/ERROR/ {print NR, $0}' /var/log/syslog # 提取错误行及行号
- 数据统计:df -h | awk '//$/ {print $5}' | tr -d '%' # 提取根分区使用率
- 格式化输出:awk -F: 'BEGIN{OFS=" | "} {print $1, $3, $6}' /etc/passwd # 自定义分隔符
总结:AWK 通过灵活的模式匹配、字段操作和流程控制,能够高效处理结构化文本。结合 BEGIN/END 块和Shell命令调用,可实现复杂的数据处理任务。掌握其内建变量和运算逻辑是提升文本处理效率的关键。