目录
Please enable Javascript to view the contents

Linux awk — 速查手册

 ·  ☕ 2 分钟

重要

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

分解:

步骤命令效果
提取 IPawk '{print $1}'取每行第一个字段
排序sortuniq -c 合并相同行做准备
计数uniq -c行首加出现次数
倒序sort -rn按次数从高到低
取 Top10head -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'
分享

Hex
作者
Hex
CloudNative Developer