好的!这里给你整理一下 awk 中数组的使用及条件判断,帮助你快速上手 awk 脚本处理文本数据。
awk 数组和判断基础
1. awk 数组
- awk 的数组是 关联数组,下标可以是字符串或数字。
- 不同于传统语言的连续下标数组,awk 通过键值对存储数据。
1.1 数组定义与赋值
# 赋值
arr["apple"] = 5
arr[1] = "hello"
1.2 访问元素
print arr["apple"]
print arr[1]
1.3 遍历数组
for (key in arr) {
print key, arr[key]
}
2. 条件判断
2.1 if 语句
if (condition) {
# 条件为真时执行
} else if (other_condition) {
# 其他条件
} else {
# 条件都不满足时执行
}
2.2 常用条件运算符
- 关系运算符:
==
,!=
,<
,>
,<=
,>=
- 逻辑运算符:
&&
(且),||
(或),!
(非)
3. 综合示例
假设文件 data.txt
内容:
apple 10
banana 5
orange 8
apple 7
banana 3
统计每种水果的总数量,并打印数量大于10的水果:
awk '
{
arr[$1] += $2
}
END {
for (key in arr) {
if (arr[key] > 10) {
print key, arr[key]
}
}
}
' data.txt
输出:
apple 17
4. 其他小技巧
- 判断数组元素是否存在:
if (key in arr) {
print "存在"
}
- 使用三元运算符简化条件:
print (arr[key] > 10) ? "大于10" : "小于等于10"
好的!这里给你整理一个更复杂点的 awk 脚本示例,包含多维数组、字符串匹配和条件判断,适合实际文本处理场景。
复杂 awk 脚本示例
假设有一个日志文件 access.log
,内容格式如下:
2025-08-04 10:00:01 user1 GET /index.html 200
2025-08-04 10:00:02 user2 POST /submit 500
2025-08-04 10:00:03 user1 GET /about.html 200
2025-08-04 10:00:04 user3 GET /index.html 404
2025-08-04 10:00:05 user2 GET /contact.html 200
2025-08-04 10:00:06 user1 POST /submit 200
目标:
- 统计每个用户每种请求方法(GET、POST)的访问次数。
- 找出所有状态码不是 200 的请求,打印出来。
- 统计每个页面被访问的次数(GET 请求)。
脚本示例
awk '
{
user = $3
method = $4
page = $5
status = $6
# 多维数组:统计用户请求方法次数
user_method_count[user, method]++
# 统计页面访问次数(只统计GET)
if (method == "GET") {
page_count[page]++
}
# 找出非200状态码请求
if (status != 200) {
# 用数组保存异常请求
bad_requests[NR] = $0
}
}
END {
print "用户请求方法统计:"
for (key in user_method_count) {
split(key, arr, SUBSEP)
printf "用户 %s 的 %s 请求次数: %d\n", arr[1], arr[2], user_method_count[key]
}
print "\n页面访问次数 (GET请求):"
for (p in page_count) {
printf "%s 被访问 %d 次\n", p, page_count[p]
}
print "\n状态码非200的请求:"
for (i in bad_requests) {
print bad_requests[i]
}
}
' access.log
说明
user_method_count[user, method]
用了多维数组,通过SUBSEP
(默认是\034
)连接两个索引。- 用
split(key, arr, SUBSEP)
拆分索引,方便打印。 - 非 200 状态请求存进了
bad_requests
数组,方便后续集中输出。 - 逻辑清晰,便于统计和筛选。
执行效果示例
用户请求方法统计:
用户 user1 的 GET 请求次数: 2
用户 user2 的 POST 请求次数: 1
用户 user2 的 GET 请求次数: 1
用户 user3 的 GET 请求次数: 1
用户 user1 的 POST 请求次数: 1
页面访问次数 (GET请求):
/index.html 被访问 2 次
/about.html 被访问 1 次
/contact.html 被访问 1 次
状态码非200的请求:
2025-08-04 10:00:02 user2 POST /submit 500
2025-08-04 10:00:04 user3 GET /index.html 404
发表回复