冷凝awk / sed管道命令

时间:2015-09-03 16:39:04

标签: regex linux bash awk sed

我有一个看起来丑陋的命令,从传感器获取输出并将其除去不需要的字符和小数位,然后用带有尾随华氏符号的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)

4 个答案:

答案 0 :(得分:4)

# 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方法

答案 1 :(得分:3)

您可以使用此单个awk命令:

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

<强>输出:

112°F

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

答案 2 :(得分:3)

使用GNU sed:

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

输出:

112°F

答案 3 :(得分:2)

这不那么混乱了:

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" }'