awk
awk 是一种处理文本文件的语言,是一个强大的文本分析工具 awk 通过提供编程语言的功能,如变量、数学运算、字符串处理等,使得对文本文件的分析和操作变得非常灵活和高效
之所以叫 awk 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。 link (opens new window)
# sctucture
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
一个 awk 脚本通常由: BEGIN 语句块、能够使用模式匹配的通用语句块、END 语句块 3 部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被 单引号 或 双引号 中
# case
echo -e "A line 1\nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }'{print $2, $1}: 交换第一列和第二列顺序'NR==2 {print $NF}: 处理第二行, 打印第二行最后一列内容rg -t log "query url:[a-z|/]+ params:" | LC_ALL=C awk -F 'query url:| params:' '{print $2}' | sort | uniq提取请求 url 并归类总结去重
# 计算百分比
给出一段输入文本,来计算总占比.比如输入的内容如下
OPPO R9s 0.000236%
OPPO R9sk 0.000119%
Honor 8X 0.123%
OPPO R9s Plus 0.00147%
vivo Y93s 0.0536%
OPPO A1 0.0223%
JKM-AL00b 0.0502%
vivo Y3 0.155%
vivo Y97 0.0246%
vivo Y3s 0.146%
JKM-AL00 0.0335%
OPPO R9st 0.00000951%
Redmi S2 0.00118%
HUAWEI Mate 10 0.035%
vivo Y83A 0.0153%
OPPO A8 0.202%
T300-pro 0.000245%
Honor 7X 0.0126%
JKM-TL00 0.00755%
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
实现
function calc_total_percent() {
# 如果有参数则读取参数文件,否则从标准输入读取(例如支持管道输入)
if [ -f "$1" ]; then
awk '{ sub(/%$/, "", $NF); sum += $NF } END { print sum "%" }' "$1"
# 如果参数不是一个文件(或者没有提供参数),则执行不带文件名的
else
awk '{ sub(/%$/, "", $NF); sum += $NF } END { print sum "%" }'
fi
}
# 计算过程
# - sub(/%$/, "", $NF):
# - $NF:代表 Number of Fields,在 awk 中特指当前行的最后一列。
# - sub(/%$/, "", ...):利用正则替换,把结尾的 % 符号去掉,变成纯数字。
# - `sum += $NF`:将处理后的数字累加到 sum 变量中。由于 awk 会自动处理浮点数,因此不需要额外的类型转换。
# - END { print sum "%" }:当 awk 读取完所有数据行后,执行这一步操作,输出累加总和并在末尾加上 %。
# 使用
# cat <<EOF | calc_total_percent
# OPPO R9s 0.000236%
# OPPO R9sk 0.000119%
# Honor 8X 0.123%
# ... (你的其他数据)
# EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 统计 a 出现的个数
awk '{ count += gsub(/a/, "a") } END { print count }' filename.txt
gsub(/a/, "a"): gsub 是 awk 用来替换字符串的函数,这里我们并不需要替换,只是用它来统计每一行中 a 字符的个数/a/是正则表达式,用来匹配字符 a- 每次 gsub 匹配到 a 时,返回匹配到的次数
- count += gsub(...): 把每一行中 a 的数量累加到 count 变量中
END { print count }: 当 awk 处理完所有行后,输出 count 的最终值,也就是文件中字符 a 出现的总次数
# 分割提取
awk -F 'query url:| params:' '{print $2}', reuslt: mainlego_api_request_url
- -F 选项
-F 是 awk 的选项,用于指定分隔符。在这个例子中,-F'query url:| params:' 意味着使用正则表达式 'query url:' 和 ' params:' 作为字段分隔符。| 在正则表达式中表示“或”,所以这两个字符串都作为分隔符
- 分隔符的作用
awk 将输入行分成多个字段。每次遇到一个分隔符,就会把分隔符两边的内容分成不同的字段
aaa query url:/test/api/example params: 123 type: POST
1
使用 query url:| params: 作为分隔符,awk 会把这行分割为三个字段:
- 第一个字段是 "aaa "(query url: 之前的内容,空白部分)
- 第二个字段是 "/test/api/example"(query url: 和 params: 之间的内容,这就是我们要提取的 URL)
- 第三个字段是 " 123"(params: 后面的内容)
{print $2}: 表示输出第二个字段
# link
上次更新: 2026/09/10, 20:52:09