【问题标题】:Condensing down an awk / sed piped command压缩 awk / sed 管道命令
【发布时间】:2015-09-03 16:39:03
【问题描述】:

我有一个看起来很丑的命令,它从传感器获取输出并去除不需要的字符和小数位,然后用 awk 打印它并带有一个尾随的华氏符号。该命令如下所示:

sensors -f | awk '/temp1/ { print $2 }' | sed 's/+//g' | awk '{ sub (/\..*/, ""); print $1 "°F" }'

此命令的输出如下所示。

101°F

该命令有点乱,但它完成了工作,考虑到我对 awk 和 sed 的了解有限,这是有话要说的。我希望有更多知识的人可以向我展示如何压缩此命令,因为我不清楚如何使用搜索模式运行 awk,然后进行替换和打印。任何帮助,将不胜感激。谢谢!

编辑:根据要求输出传感器 -f。

acpitz-virtual-0
Adapter: Virtual device
temp1:       +112.2°F  (crit = +203.0°F)
temp2:       +118.6°F  (crit = +221.0°F)

coretemp-isa-0000
Adapter: ISA adapter
Core 0:      +119.0°F  (high = +212.0°F, crit = +212.0°F)
Core 1:      +121.0°F  (high = +212.0°F, crit = +212.0°F)

【问题讨论】:

  • sensors -f 的输出添加到您的问题中。
  • 已更新输出。

标签: regex linux bash awk sed


【解决方案1】:
# Posix
sensors -f | sed -e '/^temp1:[[:blank:]]\{1,\}[+]/ !d' -e 's///;s/F.*/F/'
# GNU
sensors -f | sed '/^temp1:[[:blank:]]+[+]/!d;s///;s/F.*/F/'

另一种 sed 方法

【讨论】:

    【解决方案2】:

    您可以改用这个 awk 命令:

    sensors -f | awk '/temp1/ { gsub(/^\+|\.[[:digit:]]+/, "", $2); print $2 }'
    

    输出:

    112°F
    

    gsub(/^\+|\.[[:digit:]]+/, "", $2); 将替换报告温度中的任何前导 + 或十进制值。

    【讨论】:

    • 谢谢!我知道必须有一种方法可以用一个更简单的命令来做到这一点。
    【解决方案3】:

    使用 GNU sed:

    sensors -f | sed -nE 's/^temp1: +\+([^.]+).[0-9]*(°F).*/\1\2/p'
    

    输出:

    112°F

    【讨论】:

      【解决方案4】:

      这不那么凌乱了:

      sensors -f | awk '/temp1/{ printf "%d°F\n", $2 }'
      

      它可以工作,因为 awk 从开头开始解析字符串 $2 并在它不再符合要求时停止。因此,例如,"+234.76abcd" * 1 被解析为数字 234.76。当它在格式字符串中寻找一个整数来填充 %d 时,也会发生同样的事情。

      我更喜欢:

      sensors -f | awk '/temp1/{ print int($2) "°F" }'
      

      【讨论】:

      • 可能是我见过的最优雅的解决方案。谢谢!
      猜你喜欢
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多