awk逻辑组合专题:从基础到实战
一、专题提纲
AWK 逻辑组合专题:从基础到实战
一、专题提纲
1. 什么是 AWK 逻辑组合?
2. 基础逻辑运算符与优先级
3. 模式(Pattern)的逻辑组合方式
4. 高级逻辑组合技巧
5. 典型工作场景实战
二、核心知识点(基础篇)
1. 逻辑组合的本质
AWK 的逻辑组合是通过运算符将多个条件(模式)关联,实现“多条件筛选”或“分支处理”。核心目标:精准定位需要处理的行,并按规则执行对应动作。
2. 基础逻辑运算符
运算符 | 含义 | 示例(条件) | 说明 |
---|---|---|---|
&& | 逻辑与 | $2 > 100 && $3 == "ok" | 两个条件同时满足才成立 |
` | ` | 逻辑或 | |
! | 逻辑非 | !($1 == "admin") | 对条件取反(不满足时成立) |
3. 模式组合的 3 种基础方式
(1)单个模式块内的多条件组合(同一动作)
用逻辑运算符将多个条件写在同一个模式中,匹配后执行同一动作。
# 示例:筛选“年龄>20 且 性别为male”的行,打印姓名
awk '$2 > 20 && $3 == "male" {print $1}' student.txt
(2)多个模式块(不同条件对应不同动作)
对不同条件设置独立的 模式 {动作}
块,各自匹配并执行对应操作(类似 if-else if
)。
# 示例:按分数区间输出评价
awk '
$2 >= 90 {print $1, "→ 优秀"} # 条件1:90分以上
$2 >= 60 && $2 < 90 {print $1, "→ 及格"} # 条件2:60-89分
$2 < 60 {print $1, "→ 不及格"} # 条件3:60分以下
' scores.txt
(3)范围模式(连续区间匹配)
用 ,
分隔两个模式,表示“从第一个模式成立的行开始,到第二个模式成立的行结束”的所有行(包含边界)。
# 示例:提取日志中“[START]”到“[END]”之间的所有行
awk '/\[START\]/, /\[END\]/ {print}' app.log
4. 优先级与括号的重要性
- 优先级顺序:
!
(非) >&&
(与) >||
(或)。 - 复杂逻辑必须用
()
明确分组,避免歧义。# 错误写法(&& 优先级高于 ||,实际等价于 $1=="a" || ($2=="b" && $3>100)) awk '$1 == "a" || $2 == "b" && $3 > 100 {print}' data.txt # 正确写法(用括号明确“a或b”的组合) awk '($1 == "a" || $2 == "b") && $3 > 100 {print}' data.txt
三、高级应用技巧
1. 逻辑与正则的混合组合
将逻辑运算符与正则表达式结合,实现更灵活的匹配。
# 示例:筛选“包含error且来自192.168网段,或包含warn且状态码为500”的日志行
awk '(/error/ && $1 ~ /^192\.168\./) || (/warn/ && $9 == 500) {print}' access.log
(~
表示“匹配正则”,$1 ~ /^192\.168\./
即第1字段为192.168网段IP)
2. 条件嵌套(动作块内的逻辑组合)
在动作块({}
)中用 if-else
嵌套逻辑,实现“先筛选行,再细分处理”。
# 示例:先筛选分数>80的行,再按科目细分统计
awk '$3 > 80 { # 外层:只处理分数>80的行
if ($2 == "math") math++; # 内层:按科目累加
else if ($2 == "english") english++;
}' scores.txt
END {print "数学优秀:", math; print "英语优秀:", english}
3. 短路求值与效率优化
AWK 支持逻辑运算的“短路特性”:
A && B
:若 A 为假,直接跳过 B(无需计算)。A || B
:若 A 为真,直接跳过 B(无需计算)。
可利用此特性优化复杂逻辑的执行效率。
# 示例:先判断行是否包含“POST”请求(快速筛选),再判断状态码(复杂判断)
awk '/POST/ && $9 == 500 {print "POST请求500错误:", $7}' access.log
4. 结合数组的多条件统计
用逻辑组合定义数组的键,实现按“多维度条件”统计。
# 示例:统计“不同IP+不同状态码”的出现次数
awk '{
# 键为“IP:状态码”,仅统计GET请求且状态码非200的记录
if ($6 == "\"GET" && $9 != 200) {
key = $1 ":" $9;
count[key]++
}
} END {for (k in count) print k, count[k]}' access.log
四、典型工作场景实战
1. 日志分析:错误分类与统计
场景:从 Nginx 日志中统计“404错误(来自移动端)”和“500错误(来自PC端)”的数量。
# Nginx日志格式(简化):$1=IP,$12=设备类型,$9=状态码
awk '
# 条件1:404错误且设备为移动端
$9 == 404 && $12 ~ /Mobile/ {count_404_mobile++}
# 条件2:500错误且设备为PC端
$9 == 500 && $12 ~ /PC/ {count_500_pc++}
END {
print "移动端404次数:", count_404_mobile;
print "PC端500次数:", count_500_pc
}' access.log
2. 数据清洗:多条件过滤无效数据
场景:处理用户数据(user.txt
,格式:姓名 年龄 注册时间
),筛选“年龄>18、注册时间在2023年之后”的有效用户。
awk '
# 年龄>18 且 注册时间($3)以2023/2024开头(假设格式YYYY-MM-DD)
$2 > 18 && ($3 ~ /^2023/ || $3 ~ /^2024/) {print}
' user.txt > valid_users.txt
3. 系统配置分析:用户权限筛选
场景:从 /etc/passwd
中筛选“可登录(shell非/sbin/nologin)且家目录在/home下”的用户。
awk -F ':' '
# 分隔符为:,$7=shell,$6=家目录
$7 != "/sbin/nologin" && $6 ~ /^\/home/ {print $1, $6}
' /etc/passwd
4. 报表生成:多维度数据汇总
场景:从销售数据(sales.csv
,格式:日期,产品,销售额
)中,统计“产品A在2023年10月销售额>1000”的日期。
awk -F ',' '
NR > 1 && $2 == "A" && $1 ~ /^2023-10/ && $3 > 1000 {
print $1, "销售额:", $3
}
' sales.csv > report.txt
五、总结
- 基础核心:掌握
&&
/||
/!
的用法,明确优先级,善用括号。 - 高级技巧:结合正则、数组、条件嵌套,利用短路特性优化效率。
- 实战关键:根据场景选择“单模式多条件”或“多模式块”,优先用逻辑组合减少代码量。
通过多练习日志分析、数据清洗等场景,可快速掌握逻辑组合的精髓,提升 AWK 处理复杂文本的效率。