重要
awk 面试通常考察三个点:字段处理($1/$NF)、模式匹配(/pattern/)、BEGIN/END 块。不需要背 API,但要能解释 awk '{print $1}' access.log | sort | uniq -c | sort -rn 这条命令的每一步。
1. 基本语法
awk 以行为单位处理文本,默认按空白字符切分字段。
1
2
3
| awk '条件 {动作}' 文件名
↑ ↑
可选 默认 {print $0}
|
| 内置变量 | 含义 |
|---|
$0 | 整行 |
$1, $2, ... | 第 1, 2, … 个字段 |
$NF | 最后一个字段 |
NF | 字段数量 |
NR | 已读行号(从 1 开始) |
FNR | 当前文件内行号(多文件时与 NR 不同) |
2. 高频面试题
2.1 统计 Nginx 日志中访问量 Top 10 的 IP
1
| awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
|
分解:
| 步骤 | 命令 | 效果 |
|---|
| 提取 IP | awk '{print $1}' | 取每行第一个字段 |
| 排序 | sort | 为 uniq -c 合并相同行做准备 |
| 计数 | uniq -c | 行首加出现次数 |
| 倒序 | sort -rn | 按次数从高到低 |
| 取 Top10 | head -10 | 前 10 行 |
2.2 统计请求时间超过 1 秒的 URL
假设日志格式中第 7 列为请求耗时:
1
| awk '$7 > 1.0 {print $5, $7}' access.log
|
$7 > 1.0 是模式匹配——只有耗时大于 1.0 的行才会执行 {print ...}。
2.3 计算某一列的平均值
1
| awk '{sum += $3; count++} END {print sum/count}' data.txt
|
| 块 | 执行时机 |
|---|
BEGIN {} | 读取第一行之前 |
{} | 每一行 |
END {} | 所有行之后 |
2.4 两个文件的交集(按某一列 JOIN)
1
| awk 'NR==FNR {a[$1]=1; next} $1 in a' file1 file2
|
NR==FNR 判断当前是否在处理第一个文件——NR 全局行号,FNR 当前文件行号,仅在第一个文件时两者相等。
3. 常见误用
| 写法 | 问题 |
|---|
awk -F: 忘记加引号 | -F: 被 shell 解析,应写成 awk -F: 或 awk -F ':' |
print $1,$2 | 输出时用空格分隔;print $1 $2 会无分隔拼接 |
正则包含 / | 如匹配路径 /var/log,写成 awk '/\/var\/log/' 或用动态正则 awk '$0 ~ pat' pat='/var/log' |