awk命令
Shell Awk 命令详解:从理论到实战
概述
AWK 是一种强大的文本处理语言,专门用于文本分析和数据提取。它诞生于 20 世纪 70 年代的贝尔实验室,名称来源于其三位创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母。
AWK 主要用于扫描、过滤、统计和汇总文本数据,支持从标准输入、管道或文件中读取数据。在 Linux 系统中,常用的版本是 GAWK(GNU AWK),它是 AWK 的自由软件版本,完全兼容原有的 AWK 和 NAWK。
which awk
# 输出:/usr/bin/awk
ll `which awk`
# 输出:lrwxrwxrwx. 1 root root 4 8月 19 2022 /usr/bin/awk -> gawk
工作原理
AWK 逐行读取文本,默认以空格或制表符作为分隔符,将每行分割成多个字段,并保存到内置变量中。用户可以通过定义模式和动作来处理这些字段。
与 sed 不同,AWK 更侧重于对字段的处理,而 sed 更适合整行处理。AWK 支持逻辑运算和数学运算,能进行复杂的文本处理任务。
工作流程
AWK 程序由三个部分组成:
- BEGIN 块:在处理输入前执行,用于初始化操作。
- 主体块:对每一行输入数据执行指定的动作。
- END 块:在处理完所有输入后执行,用于汇总结果。
执行流程
- 读(Read):读取一行数据。
- 执行(Execute):根据模式匹配执行相应动作。
- 重复(Repeat):重复上述过程直到文件结束。
基本语法
命令格式
awk [选项] '模式或条件{动作}' 文件1 文件2 ...
awk -f 脚本文件 文件1 文件2 ...
常用内置变量
FS
:输入字段分隔符(默认空格或制表符)OFS
:输出字段分隔符(默认空格)NF
:当前行的字段数NR
:当前行号FNR
:各文件分别计数的行号$0
:当前行的完整内容$n
:当前行的第 n 个字段FILENAME
:当前处理的文件名RS
:输入记录分隔符(默认换行符)ORS
:输出记录分隔符(默认换行符)
实战案例
基础文本处理
# 打印文件内容
awk '{print}' zz# 指定冒号为分隔符并打印第5列
awk -F: '{print $5}' zz# 使用多个分隔符
awk -F[:/] '{print $9}' zz
内置变量使用
# 打印行号和内容
awk -F: '{print NR, $0}' /etc/passwd# 打印总行数
awk 'END{print NR}' /etc/passwd# 打印最后一列
awk -F: '{print $NF}' /etc/passwd
模式匹配
# 匹配包含root的行
awk -F: '/root/' /etc/passwd# 精确匹配第一列为root的行
awk -F: '$1=="root"' /etc/passwd# 匹配第三列大于等于1000的行
awk -F: '$3>=1000' /etc/passwd
逻辑运算
# 使用&&和||组合条件
awk -F: '$3<10 || $3>=1000' /etc/passwd
awk -F: 'NR>4 && NR<10' /etc/passwd
BEGIN和END块
# 初始化变量并计算
awk 'BEGIN{x=10;print x+1}'# 统计以/bin/bash结尾的行数
awk 'BEGIN{x=0};/\/bin\/bash$/{x++;print x,$0};END{print x}' /etc/passwd
高级功能
# if条件语句
awk -F: '{if($3<10){print $0}}' /etc/passwd# 数组使用
awk 'BEGIN{a[0]=10;a[1]=20;print a[1]}'# for循环遍历数组
awk 'BEGIN{a[0]=10;a[1]=20;a[2]=30;for(i in a){print i,a[i]}}'
生产环境应用
# 提取IP地址
ifconfig ens33 | awk '/netmask/{print "本机IP地址是:"$2}'# 统计内存使用百分比
free -m | awk '/Mem:/ {print int($3/($3+$4)*100)"%"}'# 统计日志中每个IP的出现次数
awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log | sort -r
总结
- grep/egrep:更适合单纯的文本查找和匹配
- sed:更适合对匹配到的文本进行编辑操作
- awk:更适合格式化文本和对文本进行复杂处理
AWK 是一个功能强大的文本处理工具,掌握了它的基本用法和高级特性,能够极大地提高文本处理和数据提取的效率。无论是简单的字段提取还是复杂的数据统计,AWK 都能提供优雅的解决方案。
本文介绍了 AWK 的基本概念、工作原理和实战应用,希望对你的文本处理工作有所帮助。如有任何疑问或建议,欢迎留言讨论。