Shell三剑客之awk
目录
一、awk的由来
二、awk的工作原理
三、awk的基本使用方法
1. 命令行语法
2. 基本语法结构
3. 内置变量
4. 流程控制
四、实战案例
案例1:提取特定列
案例2:条件过滤
案例3:统计与计算
案例4:字符串操作
案例5:数组应用
五、总结
一、awk的由来
1977年,贝尔实验室的 Alfred Aho、Peter Weinberger 和 Brian Kernighan 共同开发了 awk
工具。其名称来源于三位开发者姓氏的首字母组合(Aho + Weinberger + Kernighan)。awk
的诞生是为了弥补 grep
和 sed
在处理结构化文本时的不足,提供一种更强大的文本分析和数据处理能力。如今,awk
已成为 Linux/Unix 系统中文本处理的标配工具之一。
二、awk的工作原理
awk
的核心设计思想是 逐行处理文本,其工作流程分为以下步骤:
-
读取输入:按行读取文件或标准输入。
-
分割记录:将每行按指定的分隔符(默认为空格或制表符)分割成多个字段(
$1, $2, ..., $n
)。 -
模式匹配:检查当前行是否匹配预设的“模式”(如正则表达式或条件判断)。
-
执行动作:若匹配成功,则执行对应的“动作”(如打印、计算等)。
-
循环处理:重复上述过程直到所有行处理完毕。
特殊处理块:
-
BEGIN{}
:在处理任何行之前执行。 -
END{}
:在处理所有行之后执行。
三、awk的基本使用方法
1. 命令行语法
awk [选项] '模式 {动作}' 文件名
常用选项:
-
-F
:指定字段分隔符(如-F':'
表示以冒号分隔)。 -
-v
:定义变量(如-v var=value
)。
2. 基本语法结构
# 格式
模式 {动作1;动作2;...
}# 示例:打印包含"error"的行
awk '/error/ {print $0}' log.txt
3. 内置变量
变量 | 描述 | 示例 |
---|---|---|
FS | 输入字段分隔符 | BEGIN{FS=":"} |
OFS | 输出字段分隔符 | BEGIN{OFS="-"} |
NR | 当前处理的行号 | {print NR, $0} |
NF | 当前行的字段数量 | {print $NF} (最后一列) |
$0 | 整行内容 | {print $0} |
$1 | 第一个字段 | {print $1} |
4. 流程控制
支持 if
、for
、while
等结构:
# 示例:计算1~5的平方
awk 'BEGIN{for(i=1; i<=5; i++) print i, i*i}'
四、实战案例
案例1:提取特定列
目标:从 /etc/passwd
中提取用户名(第1列)和Shell类型(第7列)。
awk -F':' '{print $1, $7}' /etc/passwd
# 输出示例:
# root /bin/bash
# daemon /usr/sbin/nologin
案例2:条件过滤
目标:筛选出内存占用超过100MB的进程。
ps aux | awk '$6 > 100*1024 {print $11, $6/1024 "MB"}'
# $6为RSS(内存占用,单位KB),$11为进程名
案例3:统计与计算
目标:统计日志文件中各HTTP状态码出现的次数。
awk '{status[$9]++} END{for(code in status) print code, status[code]}' access.log
# 输出示例:
# 200 3521
# 404 23
# 500 5
案例4:字符串操作
目标:将逗号分隔的CSV文件转换为竖线分隔。
awk 'BEGIN{FS=","; OFS="|"} {$1=$1; print}' data.csv
# $1=$1 用于强制重新格式化输出
案例5:数组应用
目标:计算学生成绩的平均分。
# 输入文件 grades.txt:
# Alice 85 90 78
# Bob 72 88 95
awk '{sum=0; for(i=2; i<=NF; i++) sum+=$i; avg=sum/(NF-1); print $1, avg}' grades.txt
# 输出示例:
# Alice 84.3333
# Bob 85
五、总结
awk
凭借其灵活的字段处理、模式匹配和编程能力,成为文本处理领域的“瑞士军刀”。无论是日志分析、数据清洗,还是快速计算,awk
都能以极简的代码高效完成任务。结合 grep
和 sed
,三者共同构成Shell脚本中不可或缺的文本处理工具链。
通过掌握 awk
的核心语法和内置变量,用户可以在日常工作中大幅提升数据处理效率。尝试用 awk
替代繁琐的手动操作,体验命令行艺术的魅力吧!