首页 > 解决方案 > 使用 awk 进行点分隔解析

问题描述

我有一个命令的输出,如下所示:

hw.sensors.cpu0.temp0=39.00 degC
hw.sensors.acpitz0.temp0=27.80 degC (zone temperature)

所需的awk输出如下:

# TYPE hw_sensors gauge
hw_sensors{sensor="cpu0" reading="temp0"} 39
hw_sensors{sensor="acpitz0" reading="temp0"} 27

我现在的想法有点混乱(我不是awk大师!),所以到目前为止我的努力看起来像这样:

sysctl hw.sensors | fgrep temp0 | sed 's/\./_/g' | awk '{FS="="; print "# TYPE "$1" gauge\n"$1" "$2}' | sed -E 's/_[[:digit:]]{1,2}.*$//g' 

我想我可以继续使用更多管道,但这很可能是错误的方法!

标签: awksh

解决方案


这对您来说可能是最简单且适应性最强的:

awk 'BEGIN{FS="="}'
     {key=$1; value=$2}
     {split(key,k,/[.]/)}
     {split(value,v)}
     {print k[1]"_"k[2]"{sensor=\042" k[3] "\042 reading=\042"k[4]"\042}",v[1]}'

这通过以下方式工作:

  1. 将每一行拆分为键值对:

    line: hw.sensors.cpu0.temp0=39.00 degC
    => key=hw.sensors.cpu0.temp0
    => value=39.00 degC
    
  2. 根据点作为分隔符拆分子部分中的键,将部分存储在数组中k

    key=hw.sensors.cpu0.temp0
    split(key,k,/[.]/)
    => k=(hw,sensor,cpu0,temp0)
    
  3. 根据空白作为分隔符拆分子部分中的值,将数组 v 中的部分分开:

    value=39.00 degC
    split(value,v)
    => k=(39.00,degC)
    
  4. 以您喜欢的方式重新组装零件:

    print k[1]"_"k[2]"{sensor=\042" k[3] "\042 reading=\042"k[4]"\042}",v[1]
    

这种方法非常灵活,因为您现在可以在零件上设置条件来确定重新组装规则:示例:

(k[2]=="sensor"){ print k[1]"_"k[2]"{sensor=\042" k[3] "\042 reading=\042"k[4]"\042}",v[1] }
(k[2]=="dog") { print "This dog is",v[1], "cm long" }

推荐阅读