Linux基础-awk入门使用

3/31/2026 linuxawk

# awk 介绍

awk 是一种面向文本行的模式扫描与处理语言,名字来自三位作者(Aho、Weinberger、Kernighan)。在 Linux 上常用来按列切分、过滤、汇总日志与 CSV;和 sed 相比,awk 更擅长「按字段」做计算与统计。

awk 全称 Aho Weinberger Kernighan

# 基本用法

awk '程序' 文件...
awk -F 分隔符 '程序' 文件...
1
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

# 简单实战示例

统计某个目录下日志里不同状态码出现次数(假设状态码在第 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 的核心是「模式 { 动作 }」加上 $nNFNR 等字段与行号。日常日志与表格处理,掌握 -F、按列打印、BEGIN/END、关联数组 arr[key]++ 已能解决大部分问题;需要更复杂逻辑时,awk 本身支持函数与多语句块,可再查阅手册 man awk 或 gawk 文档深入。

Last Updated: 4/3/2026, 3:45:50 AM