grep:查找文本内容,支持正则表达式匹配,是文本检索主要工具。
sed:编辑文本,可以进行替换、删除、插入等操作,主要对文本进行修改。
awk:分析、计算、格式化文本,主要用于按列处理数据。
这篇文章我从最基础的原理开始,讲透 awk 最核心、最常用的内容。
awk 是一种处理文本数据的脚本语言,是三位外国友人创建。主要特点是:
它支持变量、条件判断、循环和数组,非常适合处理结构化数据。
一句话总结:awk = 行处理 + 列提取 + 计算统计 + 格式化输出
awk 的语法格式如下:
awk [选项] '条件 { 执行动作 }' 文件名 #注意需要单引号、{}选项:最常用 -F 指定分隔符
条件:哪些行需要处理
动作:处理完要做什么(通常是 print)
文件名:要处理的文件
awk 的工作流程:
读入一行,根据分隔符切成字段,判断是否满足条件,满足就执行 { } 里的动作继续读下一行,直到结束。
三、最核心:字段引用
awk 最强大的地方,就是按列取数据。
默认分隔符是空格或 Tab。
$0 → 代表整行
$1 → 第 1 列
$2 → 第 2 列
$NF → 最后一列
NF → 当前行有多少列
NR → 当前行号
举个最简单的例子:
awk '{print $1,$2}' 12.txt
意思就是打印12.txt的每一行的第 1 列和第 2 列。
四、指定分隔符:-F 参数
现实中,文件不一定是空格分隔。
这时必须用 -F 指定分隔符。
示例 1:查看系统用户名
awk -F ':' '{print $1}' /etc/passwd#这表示以 : 为分隔符,打印 /etc/passwd 文件中每一行的第一列

示例 2:读取 222.csv 文件第 1、2列
awk -F ',' '{print $1,$2}' 222.csv 
示例 3:按 = 分割配置文件
awk -F '=' '{print $1}' vsftpd.conf

五、最常用内置变量
这些是 awk 最常用的内置变量,记住就能写 80% 的脚本。
变量 含义
$0 整行内容
n 第 n 列
NF 一行有多少字段
$NF 最后一列
NR 当前行号
FS 输入分隔符(同 -F)
OFS 输出分隔符
BEGIN 处理前执行
END 处理完所有行执行
实用示例:
awk '{print NR $1}' 123.txt #打印123.txt的行号及第一列
awk '{print $NF}' 123.txt #打印123.txt的最后一列
六、条件筛选:按需处理
awk 支持非常强大的行过滤。
1、按数值比较
awk '$1 > 2 {print $1,$2}' data.txt#表示只打印第一列大于 2 的行的前两列。

2、按字符匹配
awk '/error/ {print}' messages #查找包含error的列awk '!/error/ {print}' messages #查找不包含error的列


3、多条件组合
awk支持多个条件组合,包括以下几种:
== != > < >= <= && ||
awk '$2=="20"&&$3>"11:00:00"{print}' secure
七、BEGIN 和 END:
BEGIN:处理前执行一次。相当于签到表,提前设置需要提前的列。
awk 'BEGIN{print "时间\t\t\tIP地址"} /Accepted password/ {print $1, $2, $3 "\t" $11}' /var/log/secure在处理secure中认证成功的IP和时间,相当于先列出列名称。

END:所有行处理完执行一次
一般比较适合统计总数、求和、求平均等结果计算。
awk '{sum += $2} END {print sum}' 12.txt #将12.txt的第二列求和
八、基础实战
查看系统当前占用 CPU 最高的 10 个进程
ps -aux |awk '{print $3,$11}'|sort -nr |head -10
查看内存占用最高的10个进程


打印 系统secure日志所有以192.168开头的 IP
awk '{print $11}' /var/log/secure |grep 192.168
去掉文件空行和注释行
awk '!/^$/ && !/^#/' vsftpd.confbak #去掉vsftpd配置备份文件的空号和注释行

九、总结
虽然 awk 的语法可能看起来复杂,但掌握其核心概念后,你会发现它非常强大且实用。通过合理使用字段引用、分隔符、条件筛选以及内置变量,你可以轻松实现数据提取、统计和格式化等任务。
如果你喜欢awk,建议收藏本文,遇到文本分析、数据提取,直接可以直接拿来用!