Jacky's blog
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)
  • shell

    • shell 入门指南
    • linux 入门指南
    • Shell 常用命令速查手册
    • Shell 代码片段集合
    • brew
    • nvim
    • awk
      • sctucture
      • case
        • 计算百分比
        • 统计 a 出现的个数
        • 分割提取
      • link
    • sed
    • xargs
    • fzf
    • fd
    • ssh
    • ftp
    • sftp
    • ifconfig
    • wget
    • watch
  • tool

  • client

  • 网络

  • compute_base

  • blog

  • growth

  • java

  • C&C++

  • ai

  • secure

  • cms

  • english

  • 生活

  • 金融学

  • more

  • other
  • shell
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
上次更新: 2026/09/10, 20:52:09
nvim
sed

← nvim sed→

最近更新
01
direnv
09-09
02
nvim
09-09
03
wget
09-09
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式