这是 GNU awk 的单页快速参考备忘单,其中涵盖了常用的 awk 表达式和命令。
入门
试试
该程序可用于选择文件中的特定记录并对其执行操作
1 | awk -F: '{print $1, $NF}' /etc/passwd |
| - | - | - |
|---|---|---|
-F: | 冒号作为分隔符 | |
{...} | awk 程序 | |
print | 打印当前记录 | |
$1 | 第一个字段 | |
$NF | 最后一个字段 | |
/etc/passwd | 输入数据文件 |
Awk 程序
1 | BEGIN {<初始化>} |
示例
1 | awk ' |
变量
1 | $1 $2/$(NF-1) $3/$NF |
1 | 第一个和最后一个字段 |
查看: Awk 变量
Awk 程序示例
1 | awk 'BEGIN {print "hello world"}' # 打印 "hello world" |
条件
1 | awk -F: '$3>30 {print $1}' /etc/passwd |
查看: Conditions 条件
生成 1000 个空格
1 | awk 'BEGIN{ |
查看: Loops
数组 Arrays
1 | awk 'BEGIN { |
查看: Awk 数组
函数 Functions
1 | => 5 |
查看: Functions
Awk 变量
内置变量
| :- | :- |
|---|---|
$0 | 全线 |
$1, $2...$NF | 第一个,第二个……最后一个字段 |
NR | 记录总数(Number of Records) |
NF | N个字段(Nnumber of Fields) |
OFS | Output Field Separator输出字段分隔符 (default “ “) |
FS | input Field Separator输入字段分隔符 (default “ “) |
ORS | Output Record Separator输出记录分隔符 (default “\n”) |
RS | input Record Separator输入记录分隔符 (default “\n”) |
FILENAME | 文件名 |
表达式
| :- | :- |
|---|---|
$1 == "root" | 第一个字段等于根 |
{print $(NF-1)} | 倒数第二个字段 |
NR!=1{print $0} | 从第 2 条记录开始 |
NR > 3 | 从第 4 条记录开始 |
NR == 1 | 第一次记录 |
END{print NR} | 总记录 |
BEGIN{print OFMT} | 输出格式 |
{print NR, $0} | 行号 |
{print NR " " $0} | 行号(选项卡) |
{$1 = NR; print} | 用行号替换第一个字段 |
$NF > 4 | 最后一个字段 > 4 |
NR % 2 == 0 | 甚至记录 |
NR==10, NR==20 | 记录 10 到 20 |
BEGIN{print ARGC} | 总 arguments |
ORS=NR%5?",":"\n" | 连接记录 |
示例
打印总和和平均值
1 | awk -F: '{sum += $3} |
打印参数
1 | awk 'BEGIN { |
输出字段分隔符为逗号
1 | awk 'BEGIN { FS=":";OFS=","} |
匹配位置
1 | awk 'BEGIN { |
匹配时长
1 | awk 'BEGIN { |
仅限 GNU awk
| :- | :- |
|---|---|
ENVIRON | 环境变量 |
IGNORECASE | 忽略大小写 |
CONVFMT | 转换格式 |
ERRNO | 系统错误 |
FIELDWIDTHS | 固定宽度字段 |
环境变量
| :- | :- |
|---|---|
ARGC | 数字或参数 |
ARGV | 参数数组 |
FNR | 文件记录数(File Number of Records) |
OFMT | 数字格式 (default “%.6g”) |
RSTART | 字符串中的位置 |
RLENGTH | 比赛时长 |
SUBSEP | 多维数组分隔符 (default “\034”) |
ARGIND | 参数索引 |
定义变量
1 | awk -v var1="Hello" -v var2="Wold" ' |
使用 shell 变量
1 | awk -v varName="$PWD" ' |
Awk 运算符
运算符
| :- | :- |
|---|---|
{print $1} | 第一个字段 |
$2 == "foo" | 等于 |
$2 != "foo" | 不等于 |
"foo" in array | 在数组中 |
正则表达式
| :- | :- |
|---|---|
/regex/ | 行匹配 |
!/regex/ | 行不匹配 |
$1 ~ /regex/ | 字段匹配 |
$1 !~ /regex/ | 字段不匹配 |
更多条件
| :- | :- |
|---|---|
($2 <= 4 || $3 < 20) | 或者 |
($1 == 4 && $3 < 20) | 和 |
运算符
算术运算
+-*/%++--
速记作业
+=-=*=/=%=
比较运算符
==!=<><=>=
示例
1 | awk 'BEGIN { |
不匹配
1 | awk 'BEGIN { |
如果在数组中
1 | awk 'BEGIN { |
Awk 函数
常用功能
| 函数 | 描述 |
|---|---|
index(s,t) | 字符串 s 中出现字符串 t 的位置,如果未找到则为 0 |
length(s) | 字符串 s 的长度(如果没有 arg,则为 $0) |
rand | 0 到 1 之间的随机数 |
substr(s,index,len) | 返回从索引开始的 s 的 len-char 子字符串(从 1 开始计数) |
srand | 为 rand 设置种子并返回之前的种子 |
int(x) | 将 x 截断为整数值 |
split(s,a,fs) | 将字符串 s 拆分为数组 a 由 fs 拆分,返回 a 的长度 |
match(s,r) | 字符串 s 中出现正则表达式 r 的位置,如果未找到,则为 0 |
sub(r,t,s) | 将 t 替换为字符串 s 中第一次出现的正则表达式 r(如果未给出 s,则替换为 $0) |
gsub(r,t,s) | 用 t 替换字符串 s 中所有出现的正则表达式 r |
system(cmd) | 执行cmd并返回退出状态 |
tolower(s) | 字符串 s 转小写 |
toupper(s) | 字符串 s 转大写 |
getline | 将 $0 设置为当前输入文件中的下一个输入记录 |
用户定义函数
1 | awk ' |
Awk 数组
带索引的数组
1 | awk 'BEGIN { |
带键的数组
1 | awk 'BEGIN { |
带拆分的数组
1 | awk 'BEGIN { |
带有排序的数组
1 | awk 'BEGIN { |
多维
1 | awk 'BEGIN { |
多维迭代
1 | awk 'BEGIN { |
Awk 条件
if-else 语句
1 | awk -v count=2 'BEGIN { |
三元运算符
1 | awk -v count=2 'BEGIN { |
存在
1 | awk 'BEGIN { |
不存在
1 | awk 'BEGIN { |
switch
1 | awk -F: '{ |
Awk 循环
for…i
1 | awk 'BEGIN { |
1 到 100 之间的 2 的幂
1 | awk 'BEGIN { |
for…in
1 | awk 'BEGIN { |
Arguments
1 | awk 'BEGIN { |
示例
反向记录
1 | awk -F: '{ x[NR] = $0 } |
反向字段
1 | awk -F: '{ |
按记录求和
1 | awk -F: '{ |
总结整个文件
1 | awk -F: ' |
while
1 | awk 'BEGIN { |
do…while
1 | awk '{ |
Break
1 | awk 'BEGIN { |
Continue
1 | awk 'BEGIN { |
Awk 格式化打印
用法
右对齐
1 | awk 'BEGIN{printf "|%10s|\n", "hello"}' |
左对齐
1 | awk 'BEGIN{printf "|%-10s|\n", "hello"}' |
通用说明符
| 特征符 | 描述 |
|---|---|
c | ASCII 字符 |
d | 十进制整数 |
e, E, f | 浮点格式 |
o | 无符号八进制值 |
s | 细绳 |
% | 文字百分比 |
Space 空间
1 | awk -F: '{ |
输出
1 | root /root |
Header 标题头
1 | awk -F: 'BEGIN { |
输出
1 | User Home |
各种各样的
正则表达式元字符
\^$.[]|()*+?
转义序列
| :- | :- |
|---|---|
\b | 退格 |
\f | 换页 |
\n | 换行(换行) |
\r | 回车 |
\t | 水平选项卡 |
\v | 垂直选项卡 |
运行脚本
1 | cat demo.awk |
另见
- GNU awk 用户指南 (www-zeuthen.desy.de)
- AWK cheatsheet (gist.github.com)
评论





