Jacky's blog
首页
  • Android
  • Web
  • Server
  • Python
  • iOS
  • Java
  • Vue
  • 计算机基础
  • AI
  • 全部工具
  • CLI 工具
  • 编辑器
  • 开发工具
  • 构建工具
  • 版本控制
  • 调试工具
  • 网络工具
  • 个人成长
  • 博客
  • 分类
  • 标签
  • 归档
收藏
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • Android
  • Web
  • Server
  • Python
  • iOS
  • Java
  • Vue
  • 计算机基础
  • AI
  • 全部工具
  • CLI 工具
  • 编辑器
  • 开发工具
  • 构建工具
  • 版本控制
  • 调试工具
  • 网络工具
  • 个人成长
  • 博客
  • 分类
  • 标签
  • 归档
收藏
GitHub (opens new window)
  • 开发工具

  • 构建工具

  • 版本控制

  • 容器

  • 调试工具

  • 测试工具

  • CLI 工具

    • tmux
    • oh-my-zsh
    • ripgrep 高性能文本搜索工具使用指南
    • awk
      • sctucture
      • case
        • 计算百分比
        • 统计 a 出现的个数
        • 分割提取
      • link
    • sed
    • xargs
    • fzf
    • fd
    • raycast
    • VisiData 终极生存指南(vd)
    • yq
    • direnv
    • ln 软链接/硬链接使用指南
    • watch 周期监控使用指南
    • osascript
  • 网络工具

  • 编辑器

  • 设计工具

  • 多媒体

  • 包管理

  • 平台工具

  • tools
  • cli_tools
Jacky
2024-09-05
目录

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

实现

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

# 统计 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

  1. -F 选项

-F 是 awk 的选项,用于指定分隔符。在这个例子中,-F'query url:| params:' 意味着使用正则表达式 'query url:' 和 ' params:' 作为字段分隔符。| 在正则表达式中表示“或”,所以这两个字符串都作为分隔符

  1. 分隔符的作用

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: 后面的内容)
  1. {print $2}: 表示输出第二个字段

# link

#Shell#Linux#tool#cli
上次更新: 2026/10/18, 22:14:48
ripgrep 高性能文本搜索工具使用指南
sed

← ripgrep 高性能文本搜索工具使用指南 sed→

最近更新
01
Codex 使用与会话管理指南
10-17
02
Tailscale 入门:让自己的设备跨网络互联
10-15
03
GitHub CLI(gh)工作流与 CI 排查
10-08
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式