awk - 使用 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'
我想我可以继续使用更多管道,但这很可能是错误的方法!
解决方案
这对您来说可能是最简单且适应性最强的:
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]}'
这通过以下方式工作:
将每一行拆分为键值对:
line: hw.sensors.cpu0.temp0=39.00 degC => key=hw.sensors.cpu0.temp0 => value=39.00 degC
根据点作为分隔符拆分子部分中的键,将部分存储在数组中
k
:key=hw.sensors.cpu0.temp0 split(key,k,/[.]/) => k=(hw,sensor,cpu0,temp0)
根据空白作为分隔符拆分子部分中的值,将数组 v 中的部分分开:
value=39.00 degC split(value,v) => k=(39.00,degC)
以您喜欢的方式重新组装零件:
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" }
推荐阅读
- java - BeanPropertyRowMapper 抛出 org.springframework.beans.TypeMismatchException 尽管 setPrimitivesDefaultedForNullValue(true)
- python - gunicorn 进程持有对 logrotated 文件的引用,导致磁盘空间用完
- c# - 在 Audit.WebAPI 中添加新列
- ios - UIViewcontroller 和 UITableviewcontroller Swift 的通用协议
- python - 如何将函数结果作为类的参数?
- git - Git父母和祖先之间的逻辑区别是什么
- php - 尺寸属性未显示在 WooCommerce 网站的前端
- java - 没有 JDBC 类型的方言映射:-101,同时从 Oracle 获取带时区的时间戳到 OffsetDatetime
- mysql - AdonisJs Mysql 关系不正常!每当我尝试从数据库中获取时给出空数组
- data-structures - 如何将flutter项目从windows导入linux?