You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用最少的awk语句提取日志中val_b>20的对应数值?

精简提取日志中val_b大于20数值的awk语句

需求说明

从给定日志文件中提取val_b数值大于20的对应值,将原本4条awk管道的组合精简为单条awk语句实现。

原始日志内容

2023-08-29 16:27:57.124 | test | t1 | val_a=1 val_b=2 val_c=3 val_d=4
2023-08-29 16:27:58.124 | test | t1 | val_a=1 val_c=3
2023-08-29 16:28:57.124 | test | t1 | val_a=1 val_b=2000 val_c=3 val_d=234 val_e=423
2023-08-29 17:27:57.124 | test | t1 | val_a=1 val_b=20 val_f=332
2023-08-29 17:27:57.124 | test | t1 | val_b=27
2023-08-29 17:27:57.124 | test | t1 | val_b=29 val_c=332 val_d=234 val_e=423

原始实现(4条awk管道)

awk '/val_b/' test.log | awk -F 'val_b=' '{ print $2}' | awk '$1 > 20' | awk '{print $1}'

输出结果:

2000
27
29

精简方案

以下两种单条awk语句均可完成需求:

方式1:正则匹配捕获分组

利用awk的match()函数结合正则捕获组,直接提取val_b后的数值并判断:

awk 'match($0, /val_b=([0-9]+)/, res) && res[1] > 20 {print res[1]}' test.log

方式2:遍历字段分割提取

遍历日志的每个字段,定位以val_b=开头的字段,分割出数值后判断:

awk '{for(i=1; i<=NF; i++) {if ($i ~ /^val_b=/) {split($i, val, "="); if (val[2] > 20) print val[2]}}}' test.log

两种方式执行后均会输出目标结果:

2000
27
29

内容的提问来源于stack exchange,提问作者Wawrzyniec Pruski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:58:38