好的!这里给你整理一下 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