点击关注,更多精彩
2026 NEW YEAR
awk 命令解析与扩展知识点
The Lantern Festival
一、awk 基础用法
1. 核心语法
awk 是一种用于处理文本和数据的脚本语言,其基本格式为:
awk [选项] '[条件]{指令}' 文件
条件:决定指令何时执行,支持正则表达式、数值 / 字符串比较、逻辑运算等。
指令:满足条件时执行的操作,print 是最常用的指令。多条指令可用分号分隔。
2. 常用命令选项
-F 指定字段分隔符(默认空格或 Tab)
awk -F: '{print $1,$3}' /etc/passwd
3. 内置特殊变量
FS 字段分隔符(Field Separator),与 -F 功能相同 例如:BEGIN{FS=":"}
$n 第 n 个字段,如$1、$3分别表示第 1、第 3 列 例如:print $1
$0 当前读入的整行文本内容 例如:print $0
NF 记录当前处理行的字段个数(列数) 例如:print NF
NR 记录当前已读入行的数量(行数) 例如:print NR
二、条件与模式匹配
1. 正则表达式
/正则表达式/:匹配行。
~:匹配;!~:不匹配。
列出以ro开头的用户记录
awk -F: '/^ro/{print}' /etc/passwd
列出第7个字段不以bash结尾的用户
awk -F: '$7!~/bash$/{print $1,$7}' /etc/passwd
2. 数值 / 字符串比较
运算符:==、!=、>、>=、<、<
输出第2行文本
awk 'NR==2{print}' reg.txt
输出第2列不是XX的行
awk '$2!="XX"{print}' reg.txt
3. 逻辑比较测试
&&:逻辑与(多个条件都成立)
||:逻辑或(只要有一个条件成立)
列出UID小于2的用户信息
awk -F: '$3>=0 && $3<2{print $1,$3}' /etc/passwd
列出UID为1或7的用户信息
awk -F: '$3==1 || $3==7{print $1,$3}' /etc/passwd
4. 运算符
支持 +、-、*、/、%、++、--、+=、-= 等算术运算。
输出奇数行文本
awk 'NR%2==1{print}' reg.txt
三、awk 的执行时机(BEGIN/END)
BEGIN:在所有行处理前执行,用于初始化操作(如设置分隔符)。
END:在所有行处理后执行,用于输出统计结果。
统计文本总字段数
awk 'BEGIN{i=0}{i+=NF}END{print i}' reg.txt
计算1-200内能同时被3和13整除的整数个数
awk 'BEGIN{i=0}{for(i=0;i<=200;i++)if($0%3==0&&$0%13==0)j++}END{print j}'
四、awk 数组
1. 定义与使用
定义数组:数组名[下标]=元素值
调用数组:数组名[下标]
遍历数组:for (变量 in 数组名) {print 数组名[变量]}
定义并遍历数组
awk 'BEGIN{name[0]="jim";name[1]="tom"; print name[0],name[1]}'
2. 数组与排序
可利用 sort 命令对数组提取的结果进行排序:
-n:按数字升序
-k:按指定列排序
-r:反向排序(降序)
按IP统计访问次数并排序
awk '{ip[$1]++} END{for(i in ip) print i,ip[i]}' access.log | sort -nr
五、扩展知识点
1. 多行处理与函数
多行合并:使用 getline 读取下一行,或通过数组缓存多行。
内置函数:
length(str):返回字符串长度。
sub(/old/,new,str):替换字符串中第一个匹配项。
gsub(/old/,new,str):全局替换字符串中所有匹配项。
split(str,arr,sep):按分隔符将字符串分割到数组中。
2. 脚本化 awk
当逻辑复杂时,可将 awk 脚本写入文件(如script.awk),然后执行:
awk -f script.awk data.txt
脚本文件内可包含完整的 BEGIN{...} {处理每行} END{...} 结构。
3. 与其他命令结合
awk 常与 grep、sort、uniq、head 等命令结合,构建强大的文本处理管道:
统计Nginx访问日志中访问量Top10的IP
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
❥❥❥ END
原图地址如上
公众号菜单栏网盘自取
公众号:初见别辞
壁纸分享 | 电脑技术 | 头像
你们点点“分享”,给我充点儿电吧~