Skip to content

以下是 awk 的简明中文手册,涵盖基本语法、常用命令、内置变量、函数以及实战示例。awk 是一种强大的文本处理语言,尤其适合对结构化数据(如日志、CSV、TSV 等)进行分析和格式化输出。


📘 awk 手册(中文版)

一、简介

awk 是一种模式扫描和处理语言,用于对文本文件逐行进行操作。其命名来自三位作者:Alfred Aho、Peter Weinberger 和 Brian Kernighan。

awk [选项] '模式 {动作}' 文件名

或者:

command | awk '模式 {动作}'

二、基本结构

1. 格式

awk '/pattern/ {action}' file.txt
  • /pattern/:匹配的模式(可选)
  • {action}:执行的动作(默认是打印整行)

2. 示例

awk '{print $0}' file.txt   # 打印整行
awk '{print $1}' file.txt   # 打印第一列

三、常用内置变量

变量 含义
$0 当前行的完整内容
$1, $2, ... 第 1、2、... 列的内容
NF 当前行的字段数(列数)
NR 已读取的记录号(行号)
FNR 当前文件的行号(多个文件时独立计数)
FS 输入字段分隔符,默认为空格或制表符
OFS 输出字段分隔符,默认空格
RS 输入记录分隔符,默认换行符
ORS 输出记录分隔符,默认换行符
FILENAME 当前输入文件名

四、常用命令与技巧

1. 指定字段分隔符

awk -F ',' '{print $1}' file.csv      # 使用逗号作为分隔符
awk -F '\t' '{print $2}' file.tsv     # 使用制表符作为分隔符

或者在脚本中设置:

awk 'BEGIN{FS=","} {print $1}' file.csv

2. 打印特定行

awk 'NR == 3' file.txt         # 打印第3行
awk 'NR >= 2 && NR <=5' file.txt  # 打印第2到第5行

3. 条件判断

awk '$3 > 100' file.txt        # 打印第三列大于100的行
awk '$2 == "error"' file.txt   # 打印第二列等于"error"的行

4. 计算总和、平均值等

awk '{sum += $1} END {print sum}' file.txt  # 求第一列总和
awk '{sum += $1} END {print sum/NR}' file.txt  # 求平均值

5. 统计出现次数

awk '{count[$1]++} END {for (key in count) print key, count[key]}' file.txt

这个命令会统计第一列每个值出现的次数。


6. 多文件处理

awk 'NR==FNR {a[$1]; next} $1 in a' file1.txt file2.txt
  • NR==FNR 表示正在处理第一个文件。
  • 此命令可用于找出两个文件中第一列相同的行。

7. 修改内容并输出

awk '{$3 = $3 * 2; print}' file.txt   # 将第三列翻倍后输出

五、流程控制语句

if 判断

awk '{if ($3 > 90) print $1, "优秀"; else print $1, "及格"}' file.txt

for 循环

awk '{for(i=1; i<=NF; i++) print $i}' file.txt   # 打印每一列

六、函数支持

内置函数

  • length($0):返回当前行长度
  • substr(s, i, l):从字符串 s 的第 i 个位置开始截取长度为 l 的子串
  • index(s, t):返回 t 在 s 中的位置,不存在则返回 0
  • split(s, arr, sep):将字符串 s 按 sep 分割到数组 arr 中
  • match(s, r):匹配正则表达式 r,成功返回起始位置
  • tolower() / toupper():大小写转换

自定义函数(GNU awk 支持)

awk '
function square(x) {
    return x*x
}
{print square($1)}
' file.txt

七、实战示例

示例 1:提取访问日志中的 IP 地址(假设 IP 是第一列)

awk '{print $1}' access.log

示例 2:查找最大值

awk 'NR == 1 || $1 > max {max = $1} END {print max}' file.txt

示例 3:合并多列

awk '{print $1, $2, $3}' file.txt

示例 4:按条件过滤 + 输出新列

awk '$3 > 100 {print $1, $2, "达标"}' file.txt

八、注意事项

  • awk 默认以空白字符(空格或 tab)分割字段。
  • 如果你使用 macOS 或其他非 GNU 系统,请注意某些高级功能可能不支持。
  • 推荐使用 gawk(GNU awk),功能更强大。
  • 对于大型文件,awk 性能通常优于 Python 脚本。

九、参考资料

  • man awk
  • 《The AWK Programming Language》by Alfred V. Aho et al.
  • GNU Awk 用户指南:https://www.gnu.org/software/gawk/manual/