如何用最少的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
相关产品推荐
相关产品推荐

