这是 GNU awk 的单页快速参考备忘单,其中涵盖了常用的 awk 表达式和命令。
$1 $2/$(NF-1) $3/$NF
▼ ▼ ▼
┌──────┬──────────────┬───────┐
$0/NR ▶ │ ID │ WEBSITE │ URI │
├──────┼──────────────┼───────┤
$0/NR ▶ │ 1 │ baidu.com │ awk │
├──────┼──────────────┼───────┤
$0/NR ▶ │ 2 │ google.com │ 25 │
└──────┴──────────────┴───────┘
# 第一个和最后一个字段
awk -F: '{print $1,$NF}' /etc/passwd
# 带行号
awk -F: '{print NR, $0}' /etc/passwd
# 倒数第二个字段
awk -F: '{print $(NF-1)}' /etc/passwd
# 自定义字符串
awk -F: '{print $1 "=" $6}' /etc/passwd
查看: Awk 变量
awk 'BEGIN {print "hello world"}' # 打印 "hello world"
awk -F: '{print $1}' /etc/passwd # -F: 指定字段分隔符
# /pattern/ 仅对匹配的模式执行操作
awk -F: '/root/ {print $1}' /etc/passwd
# BEGIN 块在开始时执行一次
awk -F: 'BEGIN { print "uid"} { print $1 }' /etc/passwd
# END 块在最后执行一次
awk -F: '{print $1} END { print "-done-"}' /etc/passwd
awk -F: '$3>30 {print $1}' /etc/passwd
查看: Conditions 条件
awk 'BEGIN{
while (a++ < 1000)
s=s " ";
print s
}'
查看: Loops
awk 'BEGIN {
fruits["mango"] = "yellow";
fruits["orange"] = "orange"
for(fruit in fruits) {
print fruit " 的颜色是 " fruits[fruit]
}
}'
查看: Awk 数组
# => 5
awk 'BEGIN{print length("hello")}'
# => HELLO
awk 'BEGIN{print toupper("hello")}'
# => hel
awk 'BEGIN{print substr("hello", 1, 3)}'
查看: Functions
| :- | :- |
|---|---|
$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" | 连接记录 |
打印总和和平均值
awk -F: '{sum += $3}
END { print sum, sum/NR }
' /etc/passwd
打印参数
awk 'BEGIN {
for (i = 1; i < ARGC; i++)
print ARGV[i] }' a b c
输出字段分隔符为逗号
awk 'BEGIN { FS=":";OFS=","}
{print $1,$2,$3,$4}' /etc/passwd
匹配位置
awk 'BEGIN {
if (match("One Two Three", "Tw"))
print RSTART }'
匹配时长
awk 'BEGIN {
if (match("One Two Three", "re"))
print RLENGTH }'
| 函数 | 描述 |
|---|---|
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 设置为当前输入文件中的下一个输入记录 |
awk '
# 返回最小数量
function find_min(num1, num2){
if (num1 < num2)
return num1
return num2
}
# 返回最大数量
function find_max(num1, num2){
if (num1 > num2)
return num1
return num2
}
# 主功能
function main(num1, num2){
result = find_min(num1, num2)
print "Minimum =", result
result = find_max(num1, num2)
print "Maximum =", result
}
# 脚本执行从这里开始
BEGIN {
main(10, 60)
}
'
awk -F: '{ x[NR] = $0 }
END {
for (i = NR; i > 0; i--)
print x[i]
}
' /etc/passwd
awk -F: '{
for (i = NF; i > 0; i--)
printf("%s ",$i);
print ""
}' /etc/passwd
awk -F: '{
s=0;
for (i = 1; i <= NF; i++)
s += $i;
print s
}' /etc/passwd
awk -F: '
{for (i = 1; i <= NF; i++)
s += $i;
};
END{print s}
' /etc/passwd