Linux基础-awk入门使用
muyuanqiang7 3/31/2026 linuxawk
# awk 介绍
awk 是一种面向文本行的模式扫描与处理语言,名字来自三位作者(Aho、Weinberger、Kernighan)。在 Linux 上常用来按列切分、过滤、汇总日志与 CSV;和 sed 相比,awk 更擅长「按字段」做计算与统计。
awk 全称 Aho Weinberger Kernighan
# 基本用法
awk '程序' 文件...
awk -F 分隔符 '程序' 文件...
1
2
2
程序通常写成:模式 { 动作 }。省略动作时默认 { print $0 }(打印整行)。省略模式时对每一行都执行动作。
# 按列输出
默认以空白(空格、Tab)分隔字段,$1、$2… 表示第 1、2 列,$0 表示整行。
awk '{ print $1, $3 }' access.log
1
指定分隔符(例如冒号,类似 /etc/passwd):
awk -F: '{ print $1, $3 }' /etc/passwd
1
输出时自定义列分隔符(默认是空格):
awk -F: -v OFS='\t' '{ print $1, $3 }' /etc/passwd
1
# 常用内置变量
| 变量 | 含义 |
|---|---|
$0 | 当前整行 |
$1…$n | 第 n 个字段 |
NF | 当前行字段个数 |
$NF | 最后一个字段 |
NR | 已读入的行号(累计) |
FNR | 当前文件内的行号 |
FS | 输入字段分隔符(可用 -F 设置) |
OFS | 输出字段分隔符 |
RS | 输入记录分隔符(默认换行) |
# 模式匹配
只处理匹配正则的行:
awk '/ERROR/ { print $0 }' app.log
1
组合条件(示例:第 3 列大于 100):
awk '$3 > 100 { print $0 }' data.txt
1
指定行号范围(第 2 到第 5 行):
awk 'NR==2,NR==5 { print $0 }' data.txt
1
# BEGIN 与 END
BEGIN 在读入任何行前执行,常用来初始化变量或打印表头;END 在全部文件读完后执行,适合做汇总。
awk 'BEGIN { print "sum", "count" }
{ sum += $1; n++ }
END { print sum, n }' numbers.txt
1
2
3
2
3
# 简单实战示例
统计某个目录下日志里不同状态码出现次数(假设状态码在第 9 列):
awk '{ c[$9]++ } END { for (s in c) print s, c[s] }' access.log | sort -n
1
过滤并导出两列(去重可选配合 sort -u):
awk -F',' '$2 == "active" { print $1, $4 }' users.csv
1
# 小结
awk 的核心是「模式 { 动作 }」加上 $n、NF、NR 等字段与行号。日常日志与表格处理,掌握 -F、按列打印、BEGIN/END、关联数组 arr[key]++ 已能解决大部分问题;需要更复杂逻辑时,awk 本身支持函数与多语句块,可再查阅手册 man awk 或 gawk 文档深入。